【问题标题】:How do I do this in Entity Framework (multiple where's or Join)?如何在实体框架中执行此操作(多个 where 或 Join)?
【发布时间】:2009-08-13 02:14:04
【问题描述】:

我有 2 个相互关联的表

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

现在我需要检查表 A (userName) 中的一个值,并且我需要检查表 B (ClubId) 中的一个值。

所以在我看来应该是这样的

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

// return the count.

但现在我知道使用 Entity 的东西它应该使联接不那么常见,所以我想知道我是否可以使用联接来做到这一点。

我试过了

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

所以这不起作用,因为它不会返回正确的类型(第二个位置)。这正是我的想法,我希望它会起作用。

那么它应该是什么样子呢?

附言

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

【问题讨论】:

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


    【解决方案1】:

    假设您的 EF 模型具有用户和俱乐部之间的关系,可以这样做:

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

    如果您想要返回用户和俱乐部的元素,请查看查询中的联接。

    【讨论】:

    • 我会尝试,但我如何在 Linq 方法查询中做到这一点?
    【解决方案2】:

    在加入之前过滤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();
    

    【讨论】:

    • 啊。哇。我不确定我更喜欢他的情况。那 selectMany 让我失望。那么如果我需要另一个过滤器会发生什么?我会添加另一个 selectMany 吗?好吧,第一种方法语法有效,我不知道它是否在内部发生故障并执行第二件事。所有查询都将花费相同的执行时间。第二个 SelectMany 是做什么的。比如 a=> a.TableB, (a,b) =>) 是做什么的?
    • 我已经更新了帖子,修复了查询翻译。第一个 SelectMany 本质上是“扁平化”您的嵌套集合,从所有 A 中返回所有 B 的序列。第二个 SelectMany 接受两个委托,一个“collectionSelector”用于从 A 中检索 B 的集合,一个“resultSelector”用于指定给定 A 和 B 的返回值。LINQ 只选择两个输入对象,用于您的其余部分查询。
    猜你喜欢
    • 2010-09-26
    • 2016-12-20
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    相关资源
    最近更新 更多