簡體   English   中英

如何在列表中使用動態Linq <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;
            }       

我收到的運行時錯誤:類型“對象”中不存在屬性或字段“街道”

該錯誤是有道理的,因為默認情況下對象不包含“街道”,但我希望動態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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM