LINQ到实体加入其中()子句休息查询

问题描述 投票:0回答:1

使用Microsoft SQL实体框架我有一个查询在那里有时我有一个过滤条件,有时我没有,所以我试图做什么,我如下图所示。如果条件不为空,然后不要做如预期它查询从Org_Hierarchy表的一切,然后查询一切从Workers表,然后死因为时间过长的查询:

void SomeMethod(Func<PRT, bool> whereClause) {
    IQueryable<PRT> query;
    if (whereClause != null) {
        query = PRT.Where(whereClause).AsQueryable();
    } else {
        query = PRT.AsQueryable();
    }

    var data = from prt in query
               // LEFT OUTER JOIN Worker a ON prt.assigned_to = a.WWID
           join a_join in Worker on prt.assigned_to equals a_join.WWID into a_grp
           from a in a_grp.DefaultIfEmpty()
               // LEFT OUTER JOIN Worker c ON prt.closed_by = c.WWID
           join c_join in Worker on prt.closed_by equals c_join.WWID into c_grp
           from c in c_grp.DefaultIfEmpty()
               // LEFT OUTER JOIN Worker r ON prt.requestor = r.WWID
           join r_join in Worker on prt.requestor equals r_join.WWID into r_grp
           from r in r_grp.DefaultIfEmpty()
               // LEFT OUTER JOIN Org_Hierarchy o ON prt.org3 = o.OrganizationHierarchyUnitCd AND o.OrganizationHierarchyUnitTreeLevelNbr = 3 AND o.Active = true
           join o in Org_Hierarchy on prt.org3 equals o.OrganizationHierarchyUnitCd
           select new PrtInput {

如果我改变了查询,并把东西直接放在那里,只是为了测试,像where prt.id == Guid.NewGuid()右一秒钟,然后显示的查询返回的最后一行的上方。有什么招能够where子句动态添加到查询?

上面的代码是从LinqPAD这就是为什么正常的“语境”的东西是所有失踪。

linq-to-sql linq-to-entities
1个回答
0
投票

我不知道,但我认为你应该使用这样的事情:

Expression<Func<PRT ,bool>> whereClause

代替:

Func<PRT ,bool> whereClause

当使用函数功能<>,首先从分贝到存储器然后在存储器中过滤数据获取数据,但是如果使用Epression <>过滤器发送到SQL并返回结果。

也为更好的性能,您可以使用AsNoTracking()是这样的:

if (whereClause != null) {
    query = PRT.Where(whereClause).AsQueryable().AsNoTracking();
} else {
    query = PRT.AsQueryable().AsNoTracking();
} 

当你只是想在数据库上运行的查询,而无需任何插入,更新或删除的结果,它更好地利用AsNoTracking。

我希望这回答了你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.