2016-04-04 13 views
0

JSON文字列値でプロパティを逆シリアル化/シリアル化する方法と、lambda式のLINQでWHERE句をフィルタリングする方法はありますか? filterRegionListからエントリの少なくとも一つを含む行をフィルタリングするにはLINQ - JSON列とフィルタのデシリアライズ

void Main() 
{ 
    var regionList = new List<Row>() { 
     new Row { RegionJsonList = "[\"QLD\",\"NSW\"]" }, 
     new Row { RegionJsonList = "[\"TAZ\",\"SA\"]" }, 
     new Row { RegionJsonList = "[\"QLD\",\"VIC\"]" } 
    }; 

    var filterRegionList = new List<string>() { 
     "QLD", "NSW" 
    }; 

    var queryable = regionList.AsQueryable(); 


    // this is obviously wrong, i just want to find the Row that contains one on filterRegionList 
    var result = queryable.Where(r => JsonConvert.DeserializeObject<string[]>(r.RegionJsonList).Contains(filterRegionList)); 

    result.Count().Dump(); // should be 2 

} 

class Row 
{ 
    public string RegionJsonList { get;set; } 
} 
+0

誰か?助けが必要。 –

答えて

1

働くだろう次のとおりです。

var result = 
filterRegionList.Aggregate(regionList,(current,filter) => 
current.Where(r => r.RegionJsonList.Contains(filter)).ToList()) 

filterRegionListを集約し、 regionListを使用し、最終結果のためにフィルタを適用します。 RegionJsonListをDeserializeする必要はありませんでした。これはこれがそのまま動作するためですが、あなたが熱心であればその部分を追加することもできます。

また、Andフィルタを集約で適用すると、両方のフィルタが含まれている行がチェックされ、その結果が表示されます。さらに、次のように2つのエントリが選択されます。regionList

var filterRegionList = new List<string>() { "QLD" }; 
1

、あなたはEnumerable.Intersectを使用すると、空でない交差点を確認することができます。

var resultAny = queryable.Where(r => JsonConvert.DeserializeObject<string[]>(r.RegionJsonList).Intersect(filterRegionList).Any()); 

すべてを含む行をフィルタリングするにはfilterRegionListのエントリのうち、Enumerable.Exceptを使用すると、フィルタリストから行のエントリを削除できます。すべてが削除される場合、それは試合だ:

var resultAll = queryable.Where(r => !filterRegionList.Except(JsonConvert.DeserializeObject<string[]>(r.RegionJsonList)).Any()); 

(それはあなたが望むあなたの質問から完全に明確ではありませんでした。)

関連する問題