動的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;
}
受け取った実行時エラー:タイプ 'オブジェクト'にプロパティまたはフィールド 'ストリート'が存在しません
デフォルトではオブジェクトに「Street」が含まれていないため、このエラーは理にかなっていますが、動的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;
}