2009-08-13 52 views
5

我有两个表彼此有关系如何在实体框架(多个地方或联合)中执行此操作?

表A与表B有一对多的关系,所以这会在每个表中创建一个导航属性。

现在我需要检查表A(用户名)的值,我需要检查表B(ClubId)的值。

所以,在我的脑海它会是这样的

Join the tables together 
Where A.userName == "bob" && 
where B.clubId == "Car" 

// return the count. 

但现在我知道有实体的东西,应该使加入较少见,所以我想知道如果我可以用加入再去做。

我想这

int count = Entity.TableA.where(a => a.userName == "bob" && a.TableB.where(i => i.ClubId == "Car")).Count(); 

所以这也不行,因为它不会返回正确的类型(第2位置)。这就是我的想法,我期望如何完成工作。

那么它应该如何看待?

P.S

我宁愿一个例子中的LINQ查询方法做像我上面那样。

回答

4

过滤TableA你加入之前可能是更有效的:

var clubs = from a in Entity.TableA 
      where a.userName == "bob" 
      from b in a.TableB 
      where b.clubId == "Car" 
      select b; 

var count = clubs.Count(); 

您不必使用两个变量,这只是我的偏好这里的清晰度。

还是在方法的语法可以简化一下:

var count = Entity.TableA.Where(a => a.userName == "bob") 
         .SelectMany(a => a.TableB) 
         .Count(b => b.clubId == "Car"); 

不过,我不能确定EF理解这些特定的表达。如果没有,编译器会像这样翻译上面的查询:

var count = Entity.TableA.Where(a => a.userName == "bob") 
         .SelectMany(a => a.TableB, (a,b) => new { a, b }) 
         .Where(x => x.b.clubId == "Car") 
         .Count(); 
+0

啊。 哇。我不确定我的情况更好。 selectMany让我失望。那么如果我需要另一个过滤器会怎么样?我会添加另一个selectMany吗? 那么第一种方法的语法的作品我不知道它是否内部下降,并做第二件事。所有的查询将采用相同的执行时间。 什么是第二个SelectMany的。像什么是a => a.TableB,(a,b)=>)呢? – chobo2 2009-08-13 17:53:22

+0

我已经在查询翻译中修复了该帖子。 第一个SelectMany本质上“扁平化”了你的嵌套集合,从所有A中返回所有B的序列。第二个SelectMany接受两个委托,一个“collectionSelector”从A和一个“resultSelector”中检索B的集合,以指定给定A和B的返回值。LINQ只是选择两个输入对象,用于查询的其余部分。 – dahlbyk 2009-08-13 18:05:04

5

假设你的EF模型具有用户和俱乐部之间的关系可能会做这样的事情:如果你想同时返回用户和俱乐部的元素看看在查询中加入

var usersNamedBobInCarClub = 
      from A in User 
      from B in A.Clubs 
      where A.userName == "bob" && 
        B.clubId == "Car" 
      select A; 

+0

我会试试,但我该如何在Linq方法查询中做到这一点? – chobo2 2009-08-13 03:14:27