C# 如何将动态Linq与列表对象一起使用

C# 如何将动态Linq与列表对象一起使用,c#,.net,linq,dynamic-linq,C#,.net,Linq,Dynamic Linq,我有一个动态对象列表,我正在尝试使用动态Linq。我使用动态对象是因为我不知道将进入对象的属性。Linq在我的动态对象上工作,但是,为了避免巨大的硬编码if语句,我想使用动态Linq来搜索我的列表。代码段的上半部分可以工作,但我需要它动态工作,这样我就可以从属性中创建查询字符串并进行过滤 public List<dynamic> GetFilteredLocationData(List<dynamic> locationData, string searchTerm){

我有一个动态对象列表,我正在尝试使用动态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,并为每个循环使用一个好的old。重要的部分是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;
        }

在使用该属性之前,请检查它是否为null。您确实需要重新考虑您的设计。C和CLR通常不适合使用动态变量。dynamic的目的是特殊的。我认为您在这种情况下使用它太多了。不管它的名称如何,我不认为动态LINQ可以处理动态数据。IQueryable静态地依赖于ElementType属性,而dynamic的静态类型是object。我正在编写一个小部件,因此这段代码现在在两个地方使用,以后会在更多地方使用。我正在尝试使其可缩放,这样以后就不必添加if或切换块来使用不同的视图模型。考虑到这一点,如果不是动态或可扩展对象,您知道最干净的解决方案是什么吗?接口?谢谢大家的帮助。通用界面?可过滤的?