[英]How to use dynamic Linq with List<dynamic> object
我有一個嘗試使用動態Linq的動態對象列表。 我使用動態對象是因為我不知道將要進入對象的屬性。 Linq適用於我的動態對象,但是,為了避免使用大量的硬編碼if語句,我想使用動態Linq搜索列表。 該代碼段的上半部分有效,但是我需要它動態地工作,因此我可以從屬性中創建查詢字符串並進行過濾。
public List<dynamic> GetFilteredLocationData(List<dynamic> locationData, string searchTerm){
//Does work
List<dynamic> totalResults = locationData.Where(x => x.Street.ToLower().Contains(searchTerm.ToLower()) ||
x.Street.ToLower().Contains(searchTerm.ToLower()) ||
x.Zip.ToLower().Contains(searchTerm.ToLower()));
//Does not work
var testQueryString = "(Street == \"king\")";
var testResult = locationData.Where(testQueryString);
return totalResults;
}
我收到的運行時錯誤:類型“對象”中不存在屬性或字段“街道”
該錯誤是有道理的,因為默認情況下對象不包含“街道”,但我希望動態Linq的行為類似於上面的代碼。 我在這里做錯什么了嗎,還是應該采用其他方法? 如果需要,我可以提供更多詳細信息。
提前致謝!
終於我有了一個可行的解決方案! 它可能不是最有效的,但它可以滿足我的需求,並且可以保持我希望保留的動態特性。 解決方案是完全刪除Linq,並使用一個良好的for-each循環。 重要部分是IDictionary,它使我可以在每一行中搜索鍵值對。 這與我想要的功能相同,只是掉了linq。
public List<dynamic> GetFilteredLocationData(List<dynamic> locationData, string searchTerm){
List<dynamic> totalResults = new List<dynamic>();
List<string> locationProperties = new List<string> {"dynamic properties here, this was filled by call to DB for info pertaining to certain location combined with unique data"}
foreach (var locData in locationData)
{
var currentLoc = locData;
var currentLocDict = (IDictionary<string, object>)currentLoc;
bool containsSearchTerm = CheckIfLocationContainsSearch(currentLocDict, allLocationProperties, searchTerm);
if (containsSearchTerm)
{
totalResults.Add(locData);
}
}
}
public bool CheckIfLocationContainsSearch(IDictionary<string,object> location, List<string> locationProperties, string searchTerm){
foreach (var locProp in locationProperties)
{
if (location[locProp].ToString().ToLower().Contains(searchTerm))
{
return true;
}
}
return false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.