实体框架"加入"导致从SQL返回整个表

时间:2014-09-22 15:34:05

标签: linq entity-framework

我们正在编写像这样的实体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();

2 个答案:

答案 0 :(得分:0)

嗯,没有真正的答案,因为我没有足够的信息,但有一些评论可以改善您的查询。

第一句话:不要ContainsHasValue,因为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();

可以满足您的需求而无需必要的开销,评估似乎是多余的。