Linq Избранные заявления - где не в - PullRequest
6 голосов
/ 19 июня 2009

Я пытаюсь написать оператор LINQ, который эквивалентен:

select e.EmployeeID, EmployeeName = e.FirstName + ' ' + e.LastName
from Employees e
where e.EmployeeID not in
(
    select EmployeeID from Managers
)

Я думаю, я довольно близок со следующим:

from e in Employees
where e.EmployeeID !=    // This is where I'm lost
(
    from m in Managers select m.EmployeeID
)
select new
{
    e.EmployeeID,
    EmployeeName = e.FirstName + ' ' + e.LastName
}

Я пытаюсь поместить это в Html.DropDownList.

Ответы [ 5 ]

7 голосов
/ 19 июня 2009

Я не совсем уверен, какова правильная запись запроса для этого, но следующий расширенный синтаксис выполнит работу

var result = Employees
  .Where( e => !Managers.Where(m => m.EmployeeId == e.EmployeeId).Any())
  .Select( e => new { EmployeeId = e.EmployeeId, EmployeeName = e.FirstName + ' ' + e.LastName);
4 голосов
/ 19 июня 2009

Использование Any:

from e in Employees
where !Managers.Any(m => m.EmployeeID == e.EmployeeID)
select new
{
    e.EmployeeID,
    EmployeeName = e.FirstName + ' ' + e.LastName
}

Или, используя левое соединение:

from e in Employees
join m in Managers on e.EmployeeID equals m.EmployeeID into managerGroup
from m in managerGroup.DefaultIfEmpty()
where m == null
select new
{
    e.EmployeeID,
    EmployeeName = e.FirstName + ' ' + e.LastName
}
3 голосов
/ 22 июня 2009

Вы можете получить желаемый результат с помощью плавной реализации Linq.Except () :

List<Employee> employees = new List<Employee>
    {
        new Employee { EmployeeID = 1, FirstName = "John", LastName = "Smith" },
        new Employee { EmployeeID = 2, FirstName = "Jane", LastName = "Doe" },
        new Employee { EmployeeID = 3, FirstName = "Eddie", LastName = "Punchclock" }
    };
List<Employee> managers = new List<Employee>
    {
        new Employee { EmployeeID = 2, FirstName = "Jane", LastName = "Doe" },
    };
var nonManagerEmployees = employees.Except(managers, x => x.EmployeeID)
    .Select(x => new
        {
            x.EmployeeID,
            EmployeeName = x.FirstName + " " + x.LastName
        });

foreach(var entry in nonManagerEmployees)
{
    Console.WriteLine(entry.EmployeeID+" "+entry.EmployeeName);
}

выход:

1 John Smith
3 Eddie Punchclock
0 голосов
/ 19 июня 2009

Вот статья об использовании оператора IN с LINQ. С небольшой консистентной смазкой на локтях я уверен, что вы могли бы изменить технику, чтобы сделать NOT IN.

http://blogs.msdn.com/alexj/archive/2009/03/26/tip-8-writing-where-in-style-queries-using-linq-to-entities.aspx

0 голосов
/ 19 июня 2009

Используйте метод .Contains () и вставьте! создание синтаксиса стиля НЕ.

Это будет {коллекция}. Содержит (это! = К тому);

Вам это тоже может быть интересно: http://srtsolutions.com/blogs/billwagner/archive/2006/04/10/linq-samples-part-11.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...