2017-01-20 9 views
1

基本的に私はList<Indicator>をデータベースで埋めています。Linqを使用したリストでの左結合の使用c#

public class Indicator 
{ 
    public string Month { get; set; } 
    public Int NumberOfHouses { get; set; } 
    public string City { get; set; } 
} 

私は、クエリとデータベースモデリングをやっている方法は、「正しいことをする」ためには時間がかかりすぎるので、私はlinqを使用してこの問題を解決しようとしています。

私は常にN Cityをリストに掲載します。私は、データベースからのMonthレコードが関連付けられていない場合でも、それらを繰り返す必要があります。左の結合のようなもの。

私はこれ持っているのであれば:

Jan/2017  10  CityA 
Jan/2017  12  CityB 
Jan/2017  16  CityC 
Dec/2016  33  CityC 
Nov/2016  21  CityC 

をこれが期待される結果である:

Jan/2017  10  CityA 
Jan/2017  12  CityB 
Jan/2017  16  CityC 
Dec/2016  0  CityA 
Dec/2016  0  CityB 
Dec/2016  33  CityC 
Nov/2016  0  CityA 
Nov/2016  0  CityB 
Nov/2016  21  CityC 

はそれがLinqを使用してこの問題を解決することは可能ですか?

+0

default(int) == 0のでによって生成されますが、LINQクエリを書いて試してみましたか? –

+0

@ EhsanSajjadありがとう - しかし、あまりにも遅れて、すでに質問に答えた。彼は彼のために彼のコースをするためにスタックオーバーフローを得た。それは涼しいMarllonではない。 – buffjape

+0

@EhsanSajjadはい、しかし、buffjapeがしたようにはありません。私はあなたがbuffjapeを理解していますが、私はいつもSQLのこの種の問題を解決しようとしています。私は解決策を持っていましたが、Linqを使用していませんでした。それが私が助けを求めた理由です。よりクリーンでより良いソリューションです。ありがとう! –

答えて

1

はい可能です。

// All the Indicator records 
IQueryable<Indicator> data = _context.Indicators; 

// All months from database 
IQueryable<string> months = data.Select(i => i.Month).Distinct(); 

// All cities 
IQueryable<string> cities = data.Select(i => i.City).Distinct(); 

// Now your query 
var results = (from string month in months 
       from string city in cities 
       select new 
       { 
        month = month, 
        city = city, 
        count = data.Where(i => i.Month == month && i.City == city) 
           .Select(i => i.NumberOfHouses) 
           .FirstOrDefault() 
       }).ToList(); 

レコードが欠落している場合、ゼロは、はい、それは可能です.FirstOrDefault()

+0

匿名型の代わりにクエリは 'Indicator'sを再び返すことさえできます。 – wkl

+0

はい私は、ジェネリックリストを 'OrderBy'でも' Indicator'に変更しました。ありがとうございました。 –

関連する問題