Asp.net mvc 如何将where子句添加到不属于LINQ查询返回集的字段中
我想知道如何在我的linq查询中添加一个动态where子句,其中我筛选的字段不是返回集的一部分 查询:Asp.net mvc 如何将where子句添加到不属于LINQ查询返回集的字段中,asp.net-mvc,linq,Asp.net Mvc,Linq,我想知道如何在我的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 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子句,而不必再次输入整个查询 其他动态搜索可以工作,因为它们是扩展搜索类的属性 当您运行查询时,将返回可枚举的ExtendedPersonSearch对象。一旦恢复,您只能按该对象上存在的属性进行过滤 就像在现实生活中一样,你不能根据宠物拥有的CPU核数量来过滤它们(这根本没有意义) 如果需要单个查询,可以修改行
where pl.PlanId == searchPlanId
将来
这样,如果没有输入搜索计划,条件的第一部分将被命中,它将短路并返回所有记录。如果输入了搜索计划id,则第一个子句为false,因此C#将转到第二个子句,并确保pl.PlanId与输入的搜索计划id相等
或者,您可以将PlanId添加到ExtendedPersonSearch对象,并在从数据源检索后对其进行筛选。但这可能不是最好的主意,因为一旦筛选出与计划id不匹配的结果,您将收回大量数据,但最终会丢弃大部分数据。完美,这正是我需要的!
where (searchPlanId == null || pl.PlanId == searchPlanId)