Как написать этот запрос linq, чтобы избежать слишком много запросов? - PullRequest
2 голосов
/ 06 августа 2010

У меня два стола Компания и Сотрудник. И есть отношение Компания (один) - Сотрудник (много).
И я хочу объединить все имена сотрудников в строку и вывести. Я знаю, что могу написать такой запрос:

  String names = "";
    foreach(var emp in Company.Employee)
    {
         names += emp.name;
    }

Но если я использую это значение, я загружу все записи сотрудников в память, а затем проведу сравнение, что является пустой тратой времени и памяти, и снизит производительность. Итак, можно ли в linq создать такой запрос, который может возвращать все объединенные имена в одном SQL?

Заранее спасибо! Любые рекомендации будут с благодарностью!

Ответы [ 2 ]

2 голосов
/ 06 августа 2010
var employeeNames = context
                       .Company
                       .Where(c => c.Id = 0xF00)
                       .SelectMany(c => c.Employee)
                       .Select(e => e.Name)
                       .ToArray();

var result = String.Join(" ", employeeNames);

Вы можете немного изменить часть запроса, выбирая компанию, в зависимости от точной семантики и версии Entity Framework.В .NET 4.0 Entity Framework поддерживает Single().Если вас не волнуют незначительные семантические различия, вы можете использовать First() вместо SelectMany() до .NET 4.0.

0 голосов
/ 06 августа 2010

Это упрощенный вариант Даниэля, но я думаю, что он должен работать (делая предположения о схеме)

var employeeNames = (from e in context.Employee
                       where e.CompanyId = 0xF00
                       select e.Name)
                       .ToArray(); 

var result = String.Join(" ", employeeNames); 
...