代码之家  ›  专栏  ›  技术社区  ›  ryan

对实体和多对多的LINQ

  •  1
  • ryan  · 技术社区  · 14 年前

    编辑到最新版本/关注点

    我正在使用EF1并尝试执行以下操作,但我的多对多关系有问题。我有一个BuildExpression扩展方法来解决这个问题。Contains()在EF1中不可用。

    PagingUsers&group有多对多的关系。

    这是我目前为止的工作。

    // Find many groups
    public IQueryable<Group> FindGroupsByGroupIDs(List<int> group_ids)
    {
        return db.Groups.Where(LINQHelpers.BuildContainsExpression<Group, int>(g => g.Group_ID, group_ids));
    }
    
    // Find users in a group
    public IQueryable<PagingUser> FindPagingUsersByGroupID(int group_id)
    {
        return db.PagingUsers.Include("Groups").Where(u => u.Groups.Any(g => g.Group_ID == group_id));
    }
    

    现在我想把这些组合起来,找到组列表中的用户。

    public IQueryable<PagingUser> FindPagingUsersByGroupIDs(List<int> group_ids)
    {
        return from g in db.Groups.Where(LINQHelpers.BuildContainsExpression<Group,int>(g => g.Group_ID, group_ids))
                join p in db.PagingUsers on ???
                select p;
    }
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   Craig Stuntz    14 年前

    该查询的工作方式与.NET 4.0中的相同。对于.NET 3.5,请搜索“BuildContainesPression”。

        2
  •  2
  •   Enigmativity    14 年前

    试试这个:

    public IQueryable<PagingUser> FindPagingUsersByGroupIDs(List<int> group_ids)
    {
        var gids = group_ids.ToArray();
        return from p in db.PagingUsers
                where p.Groups.Any(g => gids.Contains(g.Group_ID))
                select p;
    }
    

    至于第二个问题:你想除掉哪只羔羊?是内在的还是外在的?为什么呢?

        3
  •  1
  •   Maxymus    14 年前

    回答第二个问题:

    我不明白你为什么要把它转换成大写。对于您的种类信息,Linq查询是不区分大小写的,如果您希望它以区分大小写的方式进行迭代,那么应该根据需要对列表或第一个项进行迭代,这是通过执行Linq得到的,然后按语法顺序进行并搜索大小写。