加入多对多表

时间:2010-05-27 13:03:50

标签: c# linq entity-framework .net-3.5

我遇到的情况是我提供了一种以各种方式查询数据的方法。我们为用户提供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();

但是它运行起来很糟糕(当我对它进行分析时看起来一样),有什么办法可以将这个查询推送到数据库吗?一种更好的查询方式?

2 个答案:

答案 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)

http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/

这可能会对你有所帮助。 EF可以从设计器生成与导航属性的关系,因此您不必使用连接。