2017-07-27 76 views
0

我從前端傳遞一個對象(具有屬性:'Key'和'Value')到我的後端服務,如果給定值必須查找(obj.value )包含在特定SQL Server數據庫表的特定列(obj.key)中,並返回轉換爲對象的所有匹配行的列表。LINQ查詢如果表列包含值和返回對象列表

但是,給定的代碼不適用於所有的情況,因爲大多數情況下它返回一個「對象沒有設置爲對象的實例」錯誤。

agencies = _unitOfWork.RatingAgencyRepository.GetByType(p => p.GetType().GetProperty(filter.key) 
      .GetValue(p, null).ToString().ToLower().Contains(filter.value.ToLower().Trim())).ToList(); 

我一直在嘗試解決由同事寫的一整天沒有任何結果的代碼,因爲我不是真正熟悉LINQ和EF。

在此先感謝。

+1

如果不知道更多關於您的RatingAgencyRepository.GetByType方法,很難說。無論哪種方式,這是一個非常醜陋的聲明。如果您有權修改您的存儲庫類,我建議創建一個方法,只需將過濾器對象作爲參數,然後使用它獲取具有該過濾器屬性和過濾器值的對象列表,然後將其轉換或轉換爲你想要的對象類型。 底線是你想要你的代碼是可讀和可維護的。這條線對我來說不是非常清楚或直觀。 – Torrents

+0

這是GetByType方法後面的代碼: '公共的IEnumerable GetByType(Func鍵其中) { 返回DbSet.Where(其中).ToList (); }' – spectre85

+0

這不能相同,因爲您在示例代碼中傳遞了兩個參數,並且該定義只需要一個參數。 – NetMage

回答

0

以下其中之一爲null。也許不止一個。

  1. 過濾
  2. filter.key
  3. 的對象之一
  4. 價值財產的名稱filter.key
  5. filter.value

表示由於你的表情是真的很難以可視方式進行解析,甚至在運行時異常情況下更難調試,我的建議是將過濾器重構爲更理智的東西。

var prop = typeof(RatingAgency).GetProperty(filter.key); 
var value = filter.value.Trim().ToLower(); 
_unitOfWork.RatingAgencyRepository.GetByType(p => prop 
      .GetValue(p, null).ToString().ToLower().Contains(value)).ToList()