2011-07-19 114 views
17

我有一個與aspnet_Membership表具有多對一關係的名爲UserTenders的表。
我使用的EntityFramework 4.0,當我嘗試這樣的事情,它錯誤。無法在實體框架中創建類型'System.Object'的常量值

var tenders = ctx.UserTenders 
    .Where(tender => tender.HasAdminApproved.Equals(true)) 
    .ToList(); 

該錯誤是

System.NotSupportedException
無法創建類型的恆定值 'System.Object的'。
在此上下文中僅支持基本類型('Int32,String和Guid')。

下面的代碼段工作。

var tenders = ctx.UserTenders.ToList(); 

我的代碼有什麼問題?感覺像我失去了一些非常微不足道的東西。

我想過濾所有那些具有bitHasAdminApproved作爲true

+0

回想起來,我想我解決了這樣的事情通過更換'.Equals'與'==',儘管它不太優雅。 – NickHeidke

+0

嘗試用'=='替換'.Equals'。 – Tocco

+4

我只是想知道你爲什麼不簡單地使用'.Where(tender => tender.HasAdminApproved)'? –

回答

25

嘗試更換

.Where(tender => tender.HasAdminApproved.Equals(true)) 

有了:

.Where(tender => tender.HasAdminApproved == true) 

還是如以前@Ladislav Mrnka建議,如果你的領域是bool?

.Where(tender => tender.HasAdminApproved) 
17

@Ladislav告訴你正確答案(.Where(tender => tender.HasAdminApproved))行,但爲什麼你得到這個消息,你可能想知道。您正嘗試撥打System.Boolean.Equals(Object obj)。所以你正在裝箱常數true。正如消息所述,L2E不支持非基本類型的常量,如System.Object。因此錯誤。

+1

這是一個明顯的解釋,但爲什麼編譯器會選擇使用Object的重載,而有一個重載需要Boolean? –

+1

@AshrafSabry我猜這不是編譯器挑選的重載,這是EF6如何通過檢查lambda表達式來構建查詢,我相信他們可以處理這個行爲如您所說,然後它將工作。另外,由於這不是答案,只是解釋答案,所以應該使用** edit **將其添加到接受的答案中,或者添加爲評論,在我看來(但是好的,因爲這是很舊的)。 – Alisson

4

我有同樣的異常引起的不同的問題:一個字符與字符串用作常量。我的選擇是這樣的:

from p in Person 
select new Foo 
{ 
    FullName = p.FirstName + ' ' + p.LastName 
} 

布爾條件語句我在查詢了其他地區(即「凡p.IsActive」)工作的罰款。我不得不切換到使用的字符串:

from p in Person 
select new Foo 
{ 
    FullName = p.FirstName + " " + p.LastName 
} 

這顯然不是答案OP的問題,但我無法找到的字符/字符串的問題類似的問題,所以我想將它張貼他人'好處。

2

只是想指出,你可能也使用tender.HasAdminApproved.HasValue.Equals(真))...這工作時,布爾允許空值

相關問題