如何将动态 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;
        }