2017-08-25 34 views
0

我有一個包含很多屬性的對象列表。我想編寫一個EF6查詢來提取匹配對象列表中特定屬性的所有記錄。實體框架6具有多維對象的條件

這是我有一個它不工作。

userRoles是我的List<>RoleID是我想檢查該實體的RoleId的財產。

List<DataAccess.Entities.DB.StorageContainerRole> 
    containerRoles = db.StorageContainerRoles 
         .Where(x => userRoles.Select(y => y.RoleID.Value) 
         .Contains(x.RoleId.Value)) 
         .Include(z => z.StorageContainer) 
         .ToList(); 

這是我收到的錯誤:

無法創建類型的常量值 'DataAccess.Entities.DB.UserRole'。只有原始類型或枚舉類型在此上下文中受支持。

任何幫助,將不勝感激!

+0

你怎麼知道它不工作?你檢查了你的數據嗎?你的查詢看起來不錯。 –

+0

我在我的問題中增加了錯誤 – Nugs

+0

將'userRoles.Select(y => y.RoleID.Value)'指派給查詢外部的變量並使用裏面的變量(EF6要求)。 –

回答

1

EF應該將您的查詢轉換爲SQL,並且它不知道如何處理複雜(非Primitive)結構。 因此,對於您的示例,您可以在查詢之外執行userRoles.Select(y => y.RoleID.Value),這將爲您提供原始類型的集合,這應該是EF可以解析的。

在更復雜的情況下,例如, x.RoleId == a && x.RoleType == b你應該強制EF建立SQL子句OR鏈:WHERE (roleid = 1 AND roletype = 7) OR (roleid = 2 AND roletype = 8)檢查this link它說明了如何建立與擴展代碼一個簡單的例子提供

+0

您使用的變量沒有意義,因爲您正在覆蓋正在運行foreach循環的變量。另外'.Where()'語句的組合使用'AND'構建,而不是'OR' – Progman

+0

錯誤的變量名稱。關於'AND'你是對的。謝謝 – ASpirin

2

當你有用戶角色的列表中已經獲取OR查詢,你可以建立ID列表並在您的查詢中檢查此列表:

IList<int> userRoleIds = userRoles.Select(it => it.RoleId.Value).ToList(); 

IList<StorageContainerRole> containerRoles = db.StorageContainerRoles 
    .Include(z => z.StorageContainer) 
    .Where(x => userRoleIds.Contains(x.RoleId)) 
    .ToList();