簡體   English   中英

在此上下文中僅支持原始類型或枚舉類型

[英]Only primitive types or enumeration types are supported in this context

我已經看到了很多與此主題有關的問題,但是我無法對其中所有能夠真正解決我所遇到的問題的問題進行分類。 我有一個活動實體,該實體可以跟蹤將其分配給哪個員工以及哪個員工創建了記錄並對其進行了更新。 如果刪除代碼中的“ where a.AssignedEmployee == currentUser”行,則不會在下面出現運行時錯誤。

無法創建類型為“ DataModels.Employee”的常量值。 在此上下文中僅支持原始類型或枚舉類型。

控制器

var query = from a in db.Activities
            where a.AssignedEmployee == currentUser
            where a.IsComplete == false
            orderby a.DueDate
            select a;
return View(query.ToList());

視圖

@model IEnumerable<Data.DataModels.Activity>
..........

我的猜測是,錯誤表明EF無法將Employee的相等運算符轉換為SQL(無論您是假定引用相等還是覆蓋==運算符)。 假設Employee類具有唯一的標識符,請嘗試:

var query = from a in db.Activities
            where a.AssignedEmployeeId == currentUser.Id
            where a.IsComplete == false
            orderby a.DueDate
            select a;
return View(query.ToList());

它不喜歡您試圖將整個對象相等性轉換為數據庫查詢的事實。 您只能使用常量值進行實體框架查詢,就像您執行SQL查詢一樣。 解決此問題的方法是比較ID,以查看AssignedEmployee的ID是否與employee表中當前用戶的ID相同。

附帶說明一下,如果您要跟蹤的currentUser對象不是Employee類型,則您可能需要考慮緩存該用戶的相應Employee記錄,以便更好地在以后的查詢中引用它。 這比嘗試不斷地通過該表要好得多。 (同樣,實際上,只有在另一個表中,這才會影響您)

使用==和obj.Equals的問題在於,即使將這兩個方法重載為可轉換為SQL的對象,Entity Framework也不知道如何將該方法調用轉換為SQL。 要糾正Entity Framework中的這一缺陷,您可以做的是創建一個方法,該方法返回一個表達式樹,該樹將執行您要執行的更復雜的相等性檢查。

例如,假設我們有以下課程

public class Person {
    public string Firstname { get; set; } 
    public string Lastname  { get; set; }
}

為了返回實體框架可以理解的自定義相等操作,請向Person類添加以下方法:

public static Expression<Func<Person, bool>> EqualsExpressionTree(  Person rhs )
{
    return ( lhs ) => string.Equals( lhs.Firstname, rhs.Firstname ) &&
                      string.Equals( lhs.Lastname, rhs.Lastname );
}

在LINQ查詢中,您可以像這樣利用自定義的相等代碼:

Person anotherPerson = new Person { Firstname = "John", Lastname = "Doe" }
personCont.Where( Person.EqualsExpressionTree(anotherPerson) );
//...
if ( personCont.Any( Person.EqualsExpressionTree(anotherPerson)) ) {
//...

此外,可以重寫EqualsExpressionTree方法以調用靜態Equals方法,從而使您能夠利用自定義的相等邏輯。 但是,在所有情況下,請記住, 您的代碼必須轉換為SQL表達式 ,因為我們畢竟是在調用數據庫,而不是從內存訪問內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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