2015-12-21 83 views
0

这是我的查询与Contains优化EF查询,而不是包含

db.NavFilters.Where(finalExpression) 
    .Count(x => x.Attribute1 == e.Attribute && x.Link == link && x.SubLink == subLink && db.NavItemsFilters 
    .Where(n=> !(n.Promo == string.Empty || n.Promo == null)) 
    .Select(n=>n.ItemID) 
    .Contains(x.ItemID)) 

但是,据我所知,包含是硬的操作,我需要优化它。这样的查询是否会给出相同的结果?

db.NavFilters.Where(x=> db.NavItemsFilters.Any(n=>n.Promo != string.Empty && n.ItemID == x.ItemID)) 
    .Where(finalExpression) 
    .Count(x => x.Attribute1 == e.Attribute && x.Link == link && x.SubLink == subLink) 

我知道,最好的解决方案是添加导航属性。但我不能这么做,原因很多。

回答

1

可以优化您查询是这样的:

var navFilters = db.NavFilters.Where(finalExpression); 

var thereIsAny = (from x in navFilters 
        join n in db.NavItemsFilters on x.ItemID equals n.ItemID 
        where n.Promo != string.Empty && x.Attribute1 == e.Attribute && x.Link == link && x.SubLink == subLink 
       ).Any(); 
1

IQueryable.Contains确实存在,所以您的查询应该转换为SQL。

+0

Iqueryable.contains是怎样的一个黑客,因为没有办法in'使用LINQ到SQL/LINQ到实体翻译SQL'。它只是创建了大量的'或'语句,对于大型集合,大部分时间甚至会创建该查询 –

+1

@AlexanderDerck这不是事实。当在内存集合中使用“Contains”时,你所说的内容就适用了。事实上,当用于真正的EF可查询时,'Contains'和'Any'与'EXISTS(subquery)'子句生成一个和相同的SQL。 –

+0

@IvanStoev嗯,你只是看着它,我不记得我曾读过那里的一次......谢谢你清理那个:) –