2016-04-12 7 views
0

一致する値に基づいて他のリストからフィルタリングされたマスターリスト

あなたは1つ以上の国に割り当てることができる人物を持っています。 同じ人が同じ人物が、ユーザーがフィルタリングする国、サイトと地域を選択することができ、唯一のことを果たしているユーザーを表示する必要があります一つ以上の領域に

を割り当てることができる1つまたは複数のサイト に割り当てることができます基準。

私は私が持っていると、すなわち、すべてのcriteriasを満たす人(人)をフィルタリングすることができるというの最善の方法を把握したいデータソースからメモリコレクションで使用しています:サイトを選択することができます

ユーザーを、地域や国々を対象とし、これらのすべてを組み合わせて、この基準に合致する人のリストを戻したいと思います。

どのようにすればいいですか?

次のようにPersonオブジェクトの構造は次のとおりです。

ID 
Name 
Countries (List) 
Regions (List) 
Sites (List) 

私は私の選択基準を満たすものだけで人を取得するには、マスターリストをフィルタリングするための正しいLINQ構文を把握するように見えることはできません。

ご了承ください。

+4

フィルタオブジェクトを表示できますか?どのようにフィルタデータをメソッドに渡していますか? –

+1

このプロジェクトには何らかのデータベースが関連付けられていますか?既存のスキーマはありますか?もしそうなら、そのデータベースと対話するためにどのフレームワークを使用していますか?また、スキーマ –

+0

も何ですか、国、地域、およびサイトの間に関係はありますか? –

答えて

1
var countryIdsToCheck = new List<int> { 1,3,5 }; 
var regionIdsToCheck = new List<int> { 6,8 }; 
var siteIdsToCheck= new List<int> { 35 }; 

var result = yourDbContext.Persons; 
if(countryIdsToCheck.Any()) 
{ 
    result= result.Where(s=>s.Countries.Any(x=>countryIdsToCheck.Contains(x.Id)); 
} 
if(regionIdsToCheck.Any()) 
{ 
    result= result.Where(s=>s.Regions.Any(y=>regionIdsToCheck .Contains(y.Id)); 
} 
if(siteIdsToCheck.Any()) 
{ 
    result= result.Where(s=>s.Sites.Any(z=>siteIdsToCheck.Contains(z.Id)); 
} 
var finalResult=result.ToList(); 

または単一のライナー

var result = yourDbContext.Persons 
       .Where(s=>s.Countries.Any(x=>countryIdsToCheck.Contains(x.Id)) 
        || s.Regions.Any(y=>regionIdsToCheck.Contains(y.Id)) 
        || s.Sites.Any(z=>siteIdsToCheck.Contains(z.Id))).ToList(); 
をフィルタリングすることだろう

ToList()コールは必要ありません。クイックウォッチとブレークポイントでデバッグするのに役立つように追加しました。(ToList()は式を実行し、結果をコピーします)

+0

ありがとうございます。私はこれが動作すると信じている私はdbContextにアクセスする必要はありませんが、どちらの方法でも問題はありません。再度、感謝します。 –

+0

あなたのデータベーステーブルから来るPersonのコレクションで 'yourDbContext.Persons'を置き換えてください – Shyju

+0

はい私はそれを知っています。それはただのコメントだった:) –

1

ユーザ選択をしましょうと言うに保存されている場合:

var chosenCountries = new List<Country>(); 
var chosenRegions = new List<Region>(); 
var chosenSite = new List<Site>(); 

そして、それは単にそれらの

var result = persons; 
if(chosenCountries.Any()) 
{ 
result = result.Where(p=>p.Countries.Any(c=>chosenCountries.Any(cc=>cc.Id == c.Id)); 
} 
if(chosenRegions.Any()) 
{ 
result = result.Where(p=>p.Regions.Any(r=>chosenRegions.Any(cr=>cr.Id == r.Id)); 
} 
return result.Distinct().ToList(); 
0

フィルタオブジェクトが:

public class Filter 
{ 
    public int CountryID; 
    public int RegionID; 
    public int SiteID; 
} 

var filter = new List<Filter>(); 

var result = persons.Where(p => 
     filter.Any(f => p.Countries.Any(c => c.ID == f.CountryID) && 
        f => p.Regions.Any(r => r.ID == f.RegionID) && 
        f => p.Sites.Any(s => s.ID == f.SiteID))); 
関連する問題