我如何在实体框架中执行此操作(多个位置或加入)?

时间:2009-08-13 02:14:04

标签: c# linq entity-framework linq-to-entities

我有两张彼此有关系的表

表A与表B有1对多的关系,因此这会为每个表创建一个导航属性。

现在我需要检查表A(userName)中的值,我需要检查表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();

所以这不起作用,因为它不会返回正确的类型(第二个在哪里)。这就是我的想法,我希望它能够如何运作。

那怎么看?

P.S

我宁愿在Linq方法查询中完成一个例子,就像我上面那样。

2 个答案:

答案 0 :(得分:5)

假设您的EF模型具有用户和俱乐部之间的关系,可以执行以下操作:

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

如果您希望用户和分会的返回元素都查看查询中的联接。

答案 1 :(得分: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();