使用LINQ lambda表达式在导航表中选择公共值

时间:2015-08-18 18:15:14

标签: c# asp.net-mvc linq entity-framework lambda

我有一个名为InvestigatorGroup的表和一个名为InvestigatorGroupUsers的表,用于查看哪些组具有哪些用户。我试图在两个用户之间找到共同的调查组

我的查询如下:

    public InvestigatorGroup GetCommonGroup(string userId, string investigatorUserId)
    {
        using (GameDbContext entityContext = new GameDbContext())
        {
            string[] ids = new[] { userId, investigatorUserId };

            return entityContext.InvestigatorGroups
                .Where(i => i.IsTrashed == false)
                .Include(i => i.InvestigatorGroupUsers)
                .Where(i => i.InvestigatorGroupUsers.Any(e => ids.Contains(e.UserId)))
                .OrderByDescending(i => i.InvestigatorGroupId)
                .GroupBy(i => i.InvestigatorGroupId)
                .Where(i => i.Count() > 1)
                .SelectMany(group => group).FirstOrDefault();
        }
    }

实体InvestigatorGroup如下:

public class InvestigatorGroup : IIdentifiableEntity
{
    public InvestigatorGroup()
    {
        this.InvestigatorGroupGames = new HashSet<InvestigatorGroupGame>();
        this.InvestigatorGroupUsers = new HashSet<InvestigatorGroupUser>();
    }

    // Primary key
    public int InvestigatorGroupId { get; set; }
    public string InvestigatorGroupName { get; set; }
    public bool HasGameAssignment { get; set; }
    public string GroupRoleName { get; set; }
    public bool IsTrashed { get; set; }

    // Navigation property
    public virtual ICollection<InvestigatorGroupUser> InvestigatorGroupUsers { get; private set; }
    public virtual ICollection<InvestigatorGroupGame> InvestigatorGroupGames { get; private set; }


    public int EntityId
    {
        get { return InvestigatorGroupId; }
        set { InvestigatorGroupId = value; }
    }

}

问题是它一直返回0值。它没有看到两个用户之间的共享组数为2。

我做了一个测试来返回组(我删除了计数&gt; 1条件)并且它返回了两个用户的所有组,而不仅仅是他们共同的组

我认为问题在于这一行:.Where(i => i.InvestigatorGroupUsers.Any(e => ids.Contains(e.UserId))) 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

我通过更改查询来解决此问题,以便搜索包含其中一个UserId的行。然后,它通过这些选定的行进行查询,并选择包含其他UserId(InvestigatorUserId)的行。这样只返回包含两者的行

我的新代码如下:

    public InvestigatorGroup GetCommonGroup(string userId, string investigatorUserId)
    {
        using (GameDbContext entityContext = new GameDbContext())
        {
            IEnumerable<InvestigatorGroup> userGroups = entityContext.InvestigatorGroups
                .Where(i => i.IsTrashed == false)
                .Include(i => i.InvestigatorGroupUsers)
                .Where(i => i.InvestigatorGroupUsers.Any(e => e.UserId.Contains(userId)))
                .OrderByDescending(i => i.InvestigatorGroupId);

            return userGroups.Where(i => i.InvestigatorGroupUsers.Any(e => e.UserId.Contains(investigatorUserId))).FirstOrDefault();

        }
    }