Преобразовать sql-запрос в лямбда-выражение для таблицы с внешними ключами

У меня 2 стола. Одна из них - это пользовательская таблица, которая содержит идентификатор пользователя и userSelection (внешний ключ к другой таблице), оба являются первичными ключами, поэтому несколько строк для пользователя.

Вторая таблица содержит столбцы с основным идентификатором userSelection.

Я хочу получить все строки userSelection, которые имеет идентификатор пользователя, из второй таблицы. Я тоже хочу использовать лямбда-выражения linq.

У меня он работает в sql, jsut не может преобразовать его для использования в С#.

Select * From column 
where colID in (
                 select colId from users 
                 where userID = 'someUser')

Спасибо


person zms6445    schedule 21.08.2014    source источник
comment
Если структура вашей таблицы такая, как вы говорите, я бы настроил свой SQL на этот выбор * из столбца c пользователей внутреннего соединения u на u.colid = c.colid, где u.userid = 'someUser'. Подзапросов вообще следует избегать, поскольку они выполняются для каждой строки, возвращаемой предложением from.   -  person CodeMonkey1313    schedule 21.08.2014
comment
Как бы вы написали это, используя лямбда-выражения linq? Я не умею это конвертировать.   -  person zms6445    schedule 21.08.2014


Ответы (2)


Предполагая, что вы используете Entity Framework, вам действительно нужно внутреннее соединение. это будет выглядеть примерно так:

from c in context.Column
join u in context.Users on c.ColId equals u.ColId
where u.UserId = 'SomeUser'
select c;

как лямбда, что-то вроде (в синтаксисе может чего-то не хватать) (здесь нет пункта where, но его легко добавить)

context.Column.Join( context.Users, u => u.ColId, c => c.ColId).Select
person CodeMonkey1313    schedule 21.08.2014
comment
Это не сработает. Нет, где вы фильтруете его по пользователю - person zms6445; 21.08.2014
comment
@ zms6445 zms6445 Я исправил ошибку, однако я предполагаю, что с помощью простого поиска в Entity Framework вы можете заполнить пробелы, такие как отсутствующая функция where в свободном синтаксисе API. - person CodeMonkey1313; 21.08.2014

Измените этот код на две части

Select * From column 
where colID in (
                 select colId from users 
                 where userID = 'someUser')

Первая часть для получения списка colId:

var colIds = context.users.Where(x=>x.userID == "someUser").Select(x=>x.colId).ToList();

Вторая часть, чтобы получить результат, используйте Where и List.Contains

// IQueryable result
var result = context.column.Where(x=>colIds.Contains(x.colID));

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

person Terry Wei    schedule 08.08.2018