【发布时间】:2011-02-24 15:58:24
【问题描述】:
我有一种情况,我提供了一种以各种方式查询数据的方法。我们为用户提供了 4 种不同的过滤器标准,他们可以随意混合和匹配。
例如:
public Fruit GetFruit(Boolean isLocal, string storeName, string classificationType, string state);
当所有属性都在表上时,这很简单,但我的问题是由于数据模型的复杂性而出现的。我的三个属性很简单,它们只是连接,但我有一张表位于一对多关系后面。因此,为了查询它,我必须进行多对多连接。
假设我正在尝试确定商店提供的所有水果。一家商店有一个水果列表,我们的分类类型位于多关系(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();
但它运行起来很糟糕(当我分析它时看起来一样),有什么方法可以将此查询推送到数据库?更好的查询方式?
【问题讨论】:
-
呃,
mci是什么? (如select mci。)我试图弄清楚你想从查询中得到什么,但你的示例查询没有意义,因为引用是未定义的。您是否正在尝试选择商店?水果?还有什么? -
那是一个错字...它应该是 s(商店),我以我的实际示例并尝试将其转换为人们可以理解的内容。
标签: c# linq entity-framework .net-3.5