我们正在编写像这样的实体lambda表达式查询。但是当我们查看个人资料时。几乎所有的表都用于连接将整个表返回到.net linq查询。
我们的交易表很少,有数千条记录。这导致了性能问题。 如果我们可以避免将整行返回到.net
,请告诉我们var result = (from f in f
join a in this.Context.a on f.primeryKey equals a.primeryKey
join d in this.Context.d on f.secondid equals d.secondid
join t in this.Context.t on d.thirdId equals t.thirdId
where t.isfoo && pfIds.Contains(a.fourthId.HasValue ? a.fourthId.Value : -1)
select f).Distinct().ToList();
答案 0 :(得分:0)
嗯,没有真正的答案,因为我没有足够的信息,但有一些评论可以改善您的查询。
第一句话:不要Contains
和HasValue
,因为Linq不会对这些操作进行SQL-ize。我也不太清楚这个.Context。东西。
第二:NULL不会加入智能联接。
第三:您通常只选择所需的f
字段,而不是选择f
。
答案 1 :(得分:0)
您需要重写查询。 EF真的需要让所有线路都使用运营商吗?为了评估a.fourthId列中的值。我相信
var result = (from f in f
join a in this.Context.a on f.primeryKey equals a.primeryKey
join d in this.Context.d on f.secondid equals d.secondid
join t in this.Context.t on d.thirdId equals t.thirdId
where t.isfoo && pfIds.Contains(a.fourthId)
select f).Distinct().ToList();
可以满足您的需求而无需必要的开销,评估似乎是多余的。