2015-02-18 3 views
1

Итак, моя база данных работает так. Каждая компания имеет список пользователей, относящихся к этой Компании. У каждого пользователя есть список Клиентов, относящихся к этому Пользователю. Мне нужен способ эффективно перечислить всех Клиентов, которые косвенно связаны с этой Компанией (Клиент всегда связан с Компанией Пользователя). Это то, что я придумал до сих пор:Более эффективный или более короткий способ написать этот код?

List<User> users = db.Users.Where(u => u.CompanyId == 1 /*this company's Id*/).ToList(); 
      List<Client> clients = new List<Client>(); 
      foreach (User user in users) 
      { 
       clients.AddRange(user.Clients); 
      } 

Является ли это лучший способ или есть способ, в котором использовать Linq для SQL в одной строке для оптимизации кода?

+2

Для рабочих частей кода вам необходимо оптимизировать (по времени и/или читабельности), вы должны перейти к [Обзор кода] (http://codereview.stackexchange.com/help/on-topic). –

+0

Это может быть закрыто как код-заглушка в Code Review, потому что это такой маленький фрагмент. Вы должны отправить в аренду весь метод и, возможно, раздел взаимосвязанных методов/классов. – Hosch250

+0

Linq упрощает код; он обычно не оптимизирует его. Например, ваш пример кода, вероятно, будет работать лучше, чем вызов 'SelectMany (...). ToList()', потому что список будет расти более эффективно. – phoog

ответ

2

я бы в другую сторону, и использовать SelectMany, например:

var clients = company.Users.SelectMany(u => u.Clients) 

Конечно, вы должны сначала принести объект компании (вместо того, чтобы идти от идентификатора).

+0

Я вообще не знал о функции .SelectMany(), благодарю вас за то, что я просветил меня. Есть ли недостатки в этом методе? –

+0

@ barnacle.m Не знаю, о чем я знаю. Его предназначение для сглаживания коллекций :) – BradleyDotNET

+2

'a.SelectMany (x => xB)' [works] (http://referencesource.microsoft.com/System.Core/a.html#8f3471331178bcb0) как вложенный 'foreach '- внешний цикл повторяется над' A', внутренний цикл выполняет итерацию над 'xB' и' yield return 'каждое значение в' B', поэтому от его использования нет недостатков. –