2010-04-28 2 views
0

я получить некоторые данные о клиентах в моей базе данных с помощью этого метода:Как присоединиться к результатам двух разных наборов в LINQ?

public List<KlientViewModel> GetListOfKlientViewModel() 
    { 
     List<KlientViewModel> list = _klientRepository.List().Select(k => new KlientViewModel 
      { 
       Id = k.Id, 
       Imie = k.Imie, 
       Nazwisko = k.Nazwisko, 
       Nazwa = k.Nazwa, 
       SposobPlatnosci = k.SposobPlatnosci, 
      }).ToList(); 
     return list; 
    } 

, но и у меня есть еще один метод, который рассчитывает значение дополнительного поля в KlientViewModel - поле под названием 'Naleznosci.

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

public Dictionary<int, decimal> GetNaleznosc(List<int> klientIds) 
{ 
    return klientIds.ToDictionary(klientId => klientId, klientId => (from z in _zdarzenieRepository.List() 
     from c in z.Klient.Cennik 
     where z.TypZdarzenia == (int) TypyZdarzen.Sprzedaz && z.IdTowar == c.IdTowar && z.Sprzedaz.Data >= c.Od && (z.Sprzedaz.Data < c.Do || c.Do == null) && z.Klient.Id == klientId 
     select z.Ilosc*(z.Kwota > 0 ? z.Kwota : c.Cena)).Sum() ?? 0); 
} 

Так что я хочу сделать, это объединить данные из метода GetNaleznosc с данными, полученных в методе GetListOfKlientViewModel , Я называю GetNaleznosc следующим образом:

GetNaleznosc(list.Select(k => k.Id).ToList()) 

, но не знаю, что делать дальше.

+0

Я также не уверен, что GetNaleznosc должен возвращать словарь или что-то еще лучше для этой цели. – Inez

+0

Поскольку это англоговорящий сайт, это поможет нам, если вы сможете перевести код на английский. По крайней мере, скажите нам, что означает «GetNaleznosc». –

+0

@Mark: GetNaleznosc означает GetCredit - это для каждого клиента, но пока я не храню его в отдельном поле в БД (я не хочу), и я должен вычислить его с помощью этой логики (внутри GetNaleznosc) , Я думаю, что я могу использовать здесь как-то linq join, но пока не уверен, как это сделать. – Inez

ответ

0

Получив словарь:

var dict = GetNaleznosc(list.Select(k => k.Id).ToList()); 

Теперь можно эффективно искать до десятичного значения Naleznosci для данного клиента:

foreach (var k in list) 
    k.Naleznosci = dict[k.Id]; 

Теперь вы слили значение в основной список. Это то, что вы имеете в виду?

Кстати, в вашей функции, которая строит словарь, вы принимаете его List<int>, но тогда все, что вы делаете, это вызов ToDictionary, который требует только IEnumerable<int>. Таким образом, изменить тип параметра к этому, а затем вы можете назвать это:

var dict = GetNaleznosc(list.Select(k => k.Id)); 

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

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

public decimal GetNaleznosc(int klientId) 
{ 
    return (from z in _zdarzenieRepository.List() 
     from c in z.Klient.Cennik 
     where z.TypZdarzenia == (int) TypyZdarzen.Sprzedaz && z.IdTowar == c.IdTowar && z.Sprzedaz.Data >= c.Od && (z.Sprzedaz.Data < c.Do || c.Do == null) && z.Klient.Id == klientId 
     select z.Ilosc*(z.Kwota > 0 ? z.Kwota : c.Cena)).Sum() ?? 0); 
} 

То есть, предоставляйте функцию, которая обнаруживает только одно значение. Теперь вы можете прямо построить правильный список:

public List<KlientViewModel> GetListOfKlientViewModel() 
{ 
    return _klientRepository.List().AsEnumerable().Select(k => new KlientViewModel 
     { 
      Id = k.Id, 
      Imie = k.Imie, 
      Nazwisko = k.Nazwisko, 
      Nazwa = k.Nazwa, 
      SposobPlatnosci = k.SposobPlatnosci, 
      Naleznosci = GetNaleznosc(k.Id) 
     }).ToList(); 
} 
+0

Несчастливо этот метод не работает для меня. Это дает мне: LINQ to Entities не распознает метод «System.Decimal GetNaleznosci (Int32)», и этот метод не может быть переведен в выражение хранилища. Обратите внимание, что _klientRepository.List() возвращает тип IQueryable. – Inez

+0

Но вы строите результаты в памяти в 'List '.Поэтому вы можете просто использовать метод расширения AsEnumerable, чтобы остановить Linq от попытки выполнить код в неправильном контексте; Я добавил необходимые изменения в свой последний фрагмент кода. –

Смежные вопросы