代码之家  ›  专栏  ›  技术社区  ›  Nix

连接多对多表

  •  3
  • Nix  · 技术社区  · 15 年前

    在这种情况下,我提供了一种以各种方式查询数据的方法。我们为用户提供4种不同的Fitler标准,他们可以随心所欲地进行混合和匹配。

    例如:

     public Fruit GetFruit(Boolean isLocal, string storeName, string classificationType, string state);
    

    当所有属性都在表中时,这很简单,但我的问题是由于数据模型的复杂性而产生的。我的三个属性很简单,它们只是连接,但我有一个表位于一对多关系的后面。所以为了查询它,我必须进行多对多的连接。

    所以假设我正在努力确定一家商店提供的所有水果。一家商店有水果清单,我们的分类类型位于许多关系的后面(水果分类)

    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 回复  |  直到 15 年前
        1
  •  3
  •   Craig Stuntz    15 年前

    我想这就是你想要的:

    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();
    
        2
  •  -1
  •   Femaref    15 年前

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

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