Linq查询父子关系中的多个对象

时间:2011-06-13 16:11:44

标签: c# linq entity-framework-4

我有这样的架构

套餐 - >列表 - >用户

所有'一对多'都在线下......

所以我想运行一个查询,在那里我获得userID在用户中匹配的所有包。

var pck = (from pk in context.Package
             where pk.Lists[here's my problem]

我认为此处的导航属性为:pk.Lists. *Users.UserId* == MyUserId,但我没有在列表级别看到导航属性。

我还没有像这样更复杂的EF查询。我环顾网络但没找到任何东西让它点击。我转向你堆叠。有人帮我看光!

编辑:再次感谢堆叠,我会尽力向前付款! 而且,所有这些答案都让我了解了ef4的力量!

5 个答案:

答案 0 :(得分:8)

我假设一个包包含多个列表,一个列表包含多个用户?你可以尝试:

var pck = content.Package
     // Outdented just for Stack Overflow's width
     .Where(pk => pk.Lists.Any(list => list.Any(u => u.UserId == myUserId)));

或使用交叉加入:

var pck = from pk in content.Package
          from list in pk.Lists
          from user in list.Users
          where user.UserId == myUserId
          select ...; // Select whatever you're interested in

答案 1 :(得分:1)

试试这个:

pk.Lists.Any(l => l.Users.Any(u => u.UserId == MyUserId))

答案 2 :(得分:1)

context.Packages.Where(p => p.Lists.Any(l => l.Users.Contains(MyUserId)))

或者,如果您的用户是其他用户ID,那么

context.Packages.Where(p => p.Lists.Any(l => l.Users.Any(u => u.Id == MyUserId)))

答案 3 :(得分:1)

var packages =
    context.Package.Where(p =>
        p.Lists.Any(l => 
            l.Users.Any(u => u.UserId == MyUserId
        )
    );

答案 4 :(得分:1)

如果链接不可为空且方向包有很多列表且列表有很多用户,那么查询就很容易了。

var pck = from user in context.Users
          where user.UserId == userId
          select user.List.Package;