Linq向实体添加Where()子句中断查询

时间:2019-02-06 22:49:04

标签: linq-to-sql linq-to-entities

使用Microsoft SQL实体框架,我有一个查询,有时我有一个过滤条件,有时却没有,所以我尝试执行下面显示的操作。如果条件不为null,则与其按预期方式查询,不如查询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,这就是为什么通常的“上下文”内容都丢失的原因。

1 个答案:

答案 0 :(得分:0)

我不确定,但是我认为您应该使用类似这样的东西:

import androidx.appcompat.app.AppCompatActivity

安装:

android.support.v4.app.FragmentActivity

使用Func <>时,首先将数据从db提取到内存中,然后过滤内存中的数据,但是如果使用Epression <>过滤器,则将数据发送到sql并返回结果。

为了获得更好的性能,您可以像这样使用AsNoTracking():

Expression<Func<PRT ,bool>> whereClause

当您只想对数据库运行查询而不对结果进行任何插入,更新或删除时,最好使用AsNoTracking。

我希望这能回答您的问题。