使用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,这就是为什么通常的“上下文”内容都丢失的原因。
答案 0 :(得分:0)
我不确定,但是我认为您应该使用类似这样的东西:
import androidx.appcompat.app.AppCompatActivity
安装:
android.support.v4.app.FragmentActivity
使用Func <>时,首先将数据从db提取到内存中,然后过滤内存中的数据,但是如果使用Epression <>过滤器,则将数据发送到sql并返回结果。
为了获得更好的性能,您可以像这样使用AsNoTracking():
Expression<Func<PRT ,bool>> whereClause
当您只想对数据库运行查询而不对结果进行任何插入,更新或删除时,最好使用AsNoTracking。
我希望这能回答您的问题。