2010-04-28 60 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」。

我有基於客戶IDS這一領域的計算值的另一種方法,它看起來像這樣:

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); 
} 

所以我想要做的就是與方法GetListOfKlientViewModel生成的數據加入從方法GetNaleznosc數據。我這樣稱呼GetNaleznosc:

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

但是不知道下一步該怎麼做。

+0

我也不確定GetNaleznosc是否應該返回Dictionary或者其他更好的用於此目的。 – Inez 2010-04-28 22:12:52

+0

因爲這是一個講英語的網站,如果你可以把代碼翻譯成英文,它會幫助我們。至少告訴我們'GetNaleznosc'的含義。 – 2010-04-28 22:14:19

+0

@Mark:GetNaleznosc代表GetCredit - 這是每個客戶,但現在我不把它存儲在數據庫的分隔字段(我不想),我必須用這個邏輯來計算它(在GetNaleznosc中) 。我認爲我可以在這裏以某種方式使用linq加入,但不知道如何。 – Inez 2010-04-28 22:28:11

回答

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,從而避免使IDS的整個列表的不必要的中間副本。如果你打到一個數據庫,然後在內存中建立一大組結果,但在這種情況下可能不會有太大的區別,但也許值得記住這些操作的其他用途。

另外,再次查看助手函數,在字典中爲id列表構建結果集沒有明顯的優勢,因爲每個字符串都是獨立處理的。你可以簡單地把:

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 2010-04-29 09:29:04

+0

但是你正在建立內存中的結果'List '。因此,您可以簡單地使用'AsEnumerable'擴展方法來阻止Linq嘗試在錯誤的上下文中執行代碼;我已將必要的更改添加到我的最後一個代碼片段中。 – 2010-04-29 12:59:14