实体框架多对多连接查询

时间:2012-05-08 17:46:23

标签: linq entity-framework

我有一个标准的社交网络范例,其中一个用户拥有一群也是用户的朋友。

我正在使用Entity Framwork Code First,我的朋友关系定义如下:

modelBuilder.Entity<User>()
.HasMany(u => u.Friends)
.WithMany()
.Map(m =>
    {
        m.ToTable("Friendships");
        m.MapLeftKey("UserId");
        m.MapRightKey("FriendId");
    });

我想要做的是搜索我的用户表,返回所有用户,并指示每个返回的用户是否是当前用户的朋友。为了清楚起见,我希望返回朋友和非朋友用户,以及指示每个用户是否是朋友的布尔值。我知道如何在TSQL中执行此操作,这是一个基本的左外连接。

我已经看到了如何在LINQ中进行左连接的示例,但我看到的所有示例都加入了映射类型。 “我的友谊”列没有“映射”类型。

我如何在EntityFramework中执行此操作?

1 个答案:

答案 0 :(得分:1)

var list = context.Users
    .Where(u => u.Age >= 20) // sample condition, if you want ALL remove the line
    .Select(u => new
    {
        User = u,
        FriendOfCurrentUser = u.Friends.Any(f => f.UserId == currentUserId)
    })
    .ToList();

Result是包含用户和布尔友谊指示符的匿名对象列表。您还可以创建一个帮助器类UserWithFriendship并将其投射到其中(Select(u => new UserWithFriendship { ... })而不是匿名类型。