Использование ключевого слова let в запросе LINQ с EF 4.3 - PullRequest
5 голосов
/ 28 февраля 2012

У меня есть простая проблема LINQ, которую я не могу понять.У меня есть стол Users и стол Employees. Один пользователь может иметь 0 ... n сотрудников.

Я хотел бы сделать что-то вроде этого:

var result = from u in context.users
             where u.UsrId = 2
             let e = u.Employees.First()
             select new 
{
  UserId = u.UsrId,
  FirstName = e.FirstName
};

Это, конечно, не работает, потому чтоFirst() вызов незаконен.Первый () может прийти только в конце select.Что также не помогло, так это выбрать сотрудника в предыдущем запросе следующим образом:

var employee = from e. in context.Employees.....

... и затем сказать let e = employee вместо let e = u.Employees().First()

Я не уверенесли использование пусть исправить.Я думал, что это для подзапросов.

Причина вызова First() состоит в том, что таблица Employees не должна иметь более одной записи для каждого пользователя.Это ошибка в дизайне, и я должен разобраться с ней сейчас.Так что я просто хочу первый.

Ответы [ 2 ]

4 голосов
/ 28 февраля 2012
var result = from u in context.users
let e = u.Employees.FirstOrDefault(x => x.bossId == u.UsrId)
where u.UsrId = 2
select new  {   UserId = u.UsrId,   FirstName = e.FirstName }; 

Просто подсказка без теста.

1 голос
/ 28 февраля 2012

Первое можно использовать, кроме как в середине оператора запроса LINQ, когда при преобразовании этого оператора в SQL фактически не существует способа создать первое, поскольку его поведение - выдавать ошибку. Однако FirstOrDefault можно перевести в Top (1), который преобразуется в SQL. Это означает, что использование первого в середине переводимого оператора SQL на самом деле недопустимо, однако я считаю, что они допустили это как последний оператор, поскольку нулевой результат может быть преобразован в исключение после выполнения запроса.

...