LINQ для сущностей и многие ко многим - PullRequest
1 голос
/ 23 ноября 2010

Отредактировано до последней проблемы / проблемы

Я использую EF1 и пытаюсь сделать следующее, но у меня проблемы с отношениями многие ко многим. У меня есть метод расширения BuildExpression, работающий, чтобы обойти .Contains () недоступен в EF1.

PagingUsers & Groups имеют отношение «многие ко многим».

Вот то, что у меня пока работает.

// 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 ]

2 голосов
/ 24 ноября 2010

Попробуйте это:

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;
}

Что касается второго вопроса: от какой лямбды вы хотите избавиться? Внутреннее или внешнее? И почему?

1 голос
/ 24 ноября 2010

Этот запрос работает как есть в .NET 4.0.Для .NET 3.5 выполните поиск по запросу «BuildContainsExpression».

1 голос
/ 24 ноября 2010

Ответьте на ваш второй вопрос:

Я не понимаю, почему вы конвертируете его в верхний регистр.К вашему сведению, запрос Linq не чувствителен к регистру, если вы хотите, чтобы он повторялся в регистрозависимом порядке, это должно быть выполнено, повторяя список или первый элемент в зависимости от того, что вы получили, выполнив LINQ, а затем выполни-грамматически и поиск дел.

...