3 回答

TA貢獻(xiàn)1839條經(jīng)驗 獲得超15個贊
實(shí)體正在嘗試將您的Paid屬性轉(zhuǎn)換為SQL,但不能,因為它不是表模式的一部分。
你可以做的是讓實(shí)體查詢表沒有付費(fèi)過濾器,然后過濾掉非付費(fèi)過濾器。
public ActionResult Index(){ var debts = storeDB.Orders //.Where(o => o.Paid == false) .OrderByDescending(o => o.DateCreated); debts = debts.Where(o => o.Paid == false); return View(debts);}
當(dāng)然,這意味著您將所有數(shù)據(jù)帶回Web服務(wù)器并過濾其上的數(shù)據(jù)。如果要在數(shù)據(jù)庫服務(wù)器上進(jìn)行篩選,可以在表上創(chuàng)建計算列或使用存儲過程。

TA貢獻(xiàn)1859條經(jīng)驗 獲得超6個贊
只是不得不解決類似的問題。上述解決方案需要內(nèi)存處理,這是一種不好的做法(延遲加載)。
我的解決方案是編寫一個返回謂詞的幫助器:
public static class Extensions{ public static Expression<Func<Order, bool>> IsPaid() { return order => order.Payments.Sum(p => p.Amount) >= order.Total; }}
您可以將linq語句重寫為:
var debts = storeDB.Orders .Where(Extensions.IsPaid()) .OrderByDescending(o => o.DateCreated);
當(dāng)您想重用計算邏輯(DRY)時,這很方便。缺點(diǎn)是邏輯不在您的域模型中。

TA貢獻(xiàn)1818條經(jīng)驗 獲得超7個贊
Linq將語句轉(zhuǎn)換為SQL語句并將其執(zhí)行到數(shù)據(jù)庫中。
現(xiàn)在,此轉(zhuǎn)換僅適用于實(shí)體成員,初始值設(shè)定項和實(shí)體導(dǎo)航屬性。因此,要實(shí)現(xiàn)函數(shù)或獲取屬性比較,我們需要先將它們轉(zhuǎn)換為內(nèi)存列表,然后應(yīng)用函數(shù)來檢索數(shù)據(jù)。
因此,總的來說,
var debts = storeDB.Orders.toList() .Where(o => o.Paid == false) .OrderByDescending(o => o.DateCreated);
添加回答
舉報