我遇到的情况是我提供了一种以各种方式查询数据的方法。我们为用户提供4种不同的fitler标准,他们可以根据需要进行混合和匹配。
例如:
public Fruit GetFruit(Boolean isLocal, string storeName, string classificationType, string state);
当所有属性都在桌面上时,这很简单,但我的问题是由于数据模型的复杂性而产生的。我的三个属性很简单,它们只是连接,但我有一个表位于一对多的关系后面。因此,为了查询它,我必须做多对多的加入。
所以我想说我正在尝试确定商店提供的所有水果。商店有一个水果列表,我们的classificationType位于许多关系后面(FruitClassification)
alt text http://tinyurl.com/39q6ruj
我能够在EF中查询此功能的唯一成功方法是选择所有水果(按分类),然后选择符合过滤条件的所有商店,然后加入它们。
你会认为ef中的这个查询是有用的:
var final = (
from s in Stores
join fc in FruitClassifications.Where(z=>z.Classifications.Code == classificationType && z.Classifications.Type.Code =="FRT").Select(x=>x.Fruit).Distinct()
on s.Fruits.Id equals f.Id
where s.Name=name && s.isLocal && s.State==state
select s
).ToList();
但是它运行起来很糟糕(当我对它进行分析时看起来一样),有什么办法可以将这个查询推送到数据库吗?一种更好的查询方式?
答案 0 :(得分:3)
我认为这就是你想要的:
var final = (from s in Stores
where s.Name=name && s.isLocal && s.State==state
&& s.Fruits.Any(f =>
f.FruitClassifications.Any(fc => fc.Code == classificationType
&& fc.Type.Code == "FRT"))
select s).ToList();
答案 1 :(得分:-1)