2016-04-04 58 views
0

如何使用JSON字符串數組值反序列化/序列化屬性,然後在lambda表達式中的LINQ中過濾(使用where子句)?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

any guys guys?需要幫忙。 –

回答

1

下面將工作:

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

聚集filterRegionListregionList並因此應用過濾器來獲得最終結果。我沒有發現要反序列化RegionJsonList的要求,因爲這樣可以正常工作,但是如果你熱衷於這個部分,你可以添加這個部分。

另外我們通過聚合應用And過濾器,它檢查包含兩個過濾器的行,從而提供結果,您可以修改過濾器以實現更多行數,如下所示將從原始regionList

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

爲了過濾包含來自filterRegionList該條目中的至少一個行,你可以使用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()); 

(這是不是從你的問題,你想完全清楚。)