首页 文章

如何将where子句添加到不属于LINQ查询的返回集的字段中

提问于
浏览
0

我想知道如何在我的linq查询中添加动态where子句,其中我正在过滤的字段不是返回集的一部分 .

查询:

(from p in db.Person
join c in db.Client on p.PersonId equals c.PersonId into c_join
from c in c_join.DefaultIfEmpty()
join pt in db.PersonType on p.PersonTypeId equals pt.PersonTypeId into pt_join
from pt in pt_join.DefaultIfEmpty()
join pl in db.Plan on c.ClientId equals pl.ClientId into pl_join
from pl in pl_join.DefaultIfEmpty()
join plt in db.PlanType on pl.PlanTypeId equals plt.PlanTypeId into plt_join
from plt in plt_join.DefaultIfEmpty()
orderby pt.PersonTypeDescription ascending , p.LastName ascending
select new ExtendedPersonSearch
{
PersonId = p.PersonId,
FirstName = p.FirstName,
LastName = p.LastName,
MiddleName = p.MiddleName,
Aka = p.Aka,
Sin = p.Sin,
PersonTypeId = pt.PersonTypeId,
PersonTypeDescription = pt.PersonTypeDescription,
ClientId = (Int32?) c.ClientId
}).Distinct();

相关课程:

public class ExtendedPersonSearch
    {
        public int PersonId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string MiddleName { get; set; }
        public string Aka { get; set; }
        public string Sin { get; set; }
        public int PersonTypeId { get; set; }
        public string PersonTypeDescription { get; set; }
        public int? AddressId { get; set; }
        public string Street1 { get; set; }
        public int? ClientId { get; set; }

但是,我想对pl.PlanId做一个过滤器,它不是ExtendedPersonSearch类的一部分 .

这些其他类型的动态where子句适用于返回集内的项:

if (fd.Contains("txtSearchFirstName"))
                {
                    var searchFirstName = form[fd];
                    ViewData["searchFirstName"] = searchFirstName;

                    if (searchFirstName != "")
                        qryAllPerson = qryAllPerson.Where(sp => sp.FirstName.Contains(searchFirstName));

                }

如果再次根据用户是否输入了计划ID来获取此查询,则无法再次编写查询:

qryAllPerson = (from p in db.Person
join c in db.Client on p.PersonId equals c.PersonId into c_join
from c in c_join.DefaultIfEmpty()
join pt in db.PersonType on p.PersonTypeId equals pt.PersonTypeId into pt_join
from pt in pt_join.DefaultIfEmpty()
join pl in db.Plan on c.ClientId equals pl.ClientId into pl_join
from pl in pl_join.DefaultIfEmpty()
join plt in db.PlanType on pl.PlanTypeId equals plt.PlanTypeId into plt_join
from plt in plt_join.DefaultIfEmpty()
orderby pt.PersonTypeDescription ascending, p.LastName ascending
where pl.PlanId == searchPlanId
select new ExtendedPersonSearch
{
PersonId = p.PersonId,
FirstName = p.FirstName,
LastName = p.LastName,
MiddleName = p.MiddleName,
Aka = p.Aka,
Sin = p.Sin,
PersonTypeId = pt.PersonTypeId,
PersonTypeDescription = pt.PersonTypeDescription,
ClientId = (Int32?)c.ClientId
}).Distinct();

有没有办法可以简单地使用PlanId的where子句,而不必再次输入整个查询?

1 回答

  • 1

    其他动态搜索有效,因为它们是扩展搜索类的属性 .

    当您运行查询时,您将获得可枚举的ExtendedPersonSearch对象 . 一旦得到它,您只能按该对象上存在的属性进行过滤 .

    就像在现实生活中一样,你无法根据他们拥有的CPU内核数来过滤宠物(这根本没有意义 . )

    如果您想要单个查询,则可以修改该行

    where pl.PlanId == searchPlanId
    

    成为

    where (searchPlanId == null || pl.PlanId == searchPlanId)
    

    这样,如果没有输入搜索计划,则条件的第一部分被命中并且它短路并返回所有记录 . 如果输入了搜索计划ID,则第一个子句为false,因此C#将转到第二个子句并确保pl.PlanId与输入的searchPlanId相等 .

    或者,您可以将PlanId添加到ExtendedPersonSearch对象,并在从数据源检索后对其进行过滤 . 但这可能不是最好的主意,因为一旦过滤掉与计划ID不匹配的结果,您将撤回大量数据只是为了丢掉大部分数据 .

相关问题