【问题标题】:Joining a Many to Many table加入多对多表
【发布时间】: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


【解决方案1】:

我想这就是你想要的:

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,需要过滤的Stores列表,所以写了一个Stores过滤查询。良好的形式。
【解决方案2】:

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

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

【讨论】:

  • 那篇文章,一点用处都没有。正如您在上面看到的,我知道如何加入,并且无法遍历 EF 关系的多个方面。
猜你喜欢
  • 2013-10-28
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多