使用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这就是为什么正常的“语境”的东西是所有失踪。
我不知道,但我认为你应该使用这样的事情:
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。
我希望这回答了你的问题。