Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LINQ (Language-Integrated Query) > Аналог IN из SQL для разных коллекций


Автор: EASports 10.1.2016, 00:21
Всем привет!
Странно, но что-то у меня не получается нагуглить ничего по этому поводу, применительно для меня. Либо я туплю и все настолько элементарно, что никто даже не спрашивал на форумах, либо все делают как-то по другому. На самом деле я нашел способ, но мне он не нравится. Скажем так, он не изящный. 
Собственно суть.
Есть 3 класса, пусть они будут такие:

Код

class Users
{
public int id;
public string name;
}

class Roles
{
public int id;
public string name;
}

// связь многие-ко-многим этих таблиц
class UsersRoles
{
public int id;
public int userid;
public int roleid;
}


Предположим таблицы наполнены некими данными. Требуется выполнить запрос следующего плана (пишу свой способ реализации, как и говорил, надеюсь, кто-то знает более изящный):
Код

 List<Users> userlist = db.Users.SqlQuery("SELECT * FROM Users WHERE Users.id IN (SELECT [Users-Roles].userid FROM [Users-Roles] WHERE [Users-Roles].roleid = {0})", 5).ToList();

То есть мне нужно получить всех пользователей из таблицы Users с определенной ролью.
У меня в базе запрос к другим таблицам и данным, но суть та же самая.

Автор: chupachups 11.1.2016, 12:14
Так требуется выполнить запрос к таблицам SQL или все же к коллекциям объектов на C#?
В первом случае ничего элементарнее IN не придумали, можно через INNER JOIN
Во втором случае смотри https://msdn.microsoft.com/ru-ru/library/bb397919.aspx

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Analog-IN-iz-SQL-dlya-raznykh-kollektsy-id56917a73ae2015bf678b4568#findElement_E7045_56937280ae20159c64f986e9_0

Автор: EASports 16.1.2016, 22:53
Уже решил. Все намного проще оказалось.

int roleid = 1;
var users = from u in Users join ur in UsersRoles on u.id = ur.userid where ur.roleid == roleid select u;

Вроде в синтаксисе не ошибся. В редакторе не проверял. Исправляйте, если накосячил. 
Возможно кому-то поможет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)