如何将动态 Linq 与 List<dynamic> 对象一起使用
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;
}
我收到的运行时错误:类型 'Object'
中不存在 属性 或字段 'Street'
该错误是有道理的,因为默认情况下对象不包含 '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;
}
我有一个动态对象列表,我正尝试在其上使用动态 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;
}
我收到的运行时错误:类型 'Object'
中不存在 属性 或字段 'Street'该错误是有道理的,因为默认情况下对象不包含 '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;
}