Asp.net mvc LINQ to实体无法识别该方法,并且无法将该方法转换为存储表达式
我的行动如下:Asp.net mvc LINQ to实体无法识别该方法,并且无法将该方法转换为存储表达式,asp.net-mvc,linq,Asp.net Mvc,Linq,我的行动如下: var viewModel = (from o in db.Sepet join q2 in db.Urunler on o.urun_id equals q2.urun_id join m in db.Markalar on q2.marka_id equals m.marka_id where (o.sep
var viewModel = (from o in db.Sepet
join q2 in db.Urunler on o.urun_id equals q2.urun_id
join m in db.Markalar on q2.marka_id equals m.marka_id
where (o.sepet_id == bskt_id && o.statu == 0)
select new SepetView
{
urun_id = q2.urun_id,
urun_resmi = q2.resimlink,
urun_link = q2.urun_link,
urun_adi = q2.urun_adi,
urun_fiyat = FiyatGetir(q2.gununfirsati,q2.urun_fiyat,q2.kampanyafiyati),
adet = o.adet,
sepettutari = (o.adet * FiyatGetir(q2.gununfirsati, q2.urun_fiyat, q2.kampanyafiyati)),
marka_adi = m.marka_adi,
}).ToList();
并具有如下方法(FiyatGetir):
它给出了一个错误:LINQ to Entities无法识别该方法,…并且该方法无法转换为存储表达式
如何解决这个问题?括号之间的所有内容都是一个表达式。实体框架将尝试将整个表达式转换为SQL,这意味着表达式的每个部分(标记)都必须有到SQL等价物的显式映射。当然,对于
FiyatGetir
没有这样的映射,因为它是一个未知的方法(到EF)
正如在一篇评论中所说,将逻辑移到LINQ查询本身并不困难,但您需要它两次,因此最好使用let
关键字:
var viewModel = (from o in db.Sepet
join q2 in db.Urunler on o.urun_id equals q2.urun_id
join m in db.Markalar on q2.marka_id equals m.marka_id
where (o.sepet_id == bskt_id && o.statu == 0)
let fiyat = q2.gununfirsati == DateTime.Today
? q2.kampanyafiyati
: q2.urun_fiyat
select new SepetView
{
urun_id = q2.urun_id,
urun_resmi = q2.resimlink,
urun_link = q2.urun_link,
urun_adi = q2.urun_adi,
urun_fiyat = fiyat,
adet = o.adet,
sepettutari = (o.adet * fiyat),
marka_adi = m.marka_adi,
}).ToList();
注意,我将参考日期/时间更改为
DateTime.Today
。q2.gunnforsati
完全等于DateTime.Now
的概率实际上为零,因此我认为这是不正确的。也许您应该在比较之前截断q2.gunnforsati
(DbFunctions.TruncateTime
)。使用.ToList()
在之前具体化对内存的查询。Select()
我不知道tarih.Year
将如何等于DateTime.Now
-您的意思是DateTime.Now.Year
?您可以尝试使用条件运算符?:
内联函数,但访问日期时间的年份
可能无法转换为SQL。您可能还想查找LINQKit.not tarih.Year。它是tarih==DateTime.Now。我在这里写错了,可能是因为LINQ实际上正在将LINQ查询转换为SQL查询,而您在这里写的内容实际上是在数据库中执行的。如果该函数位于数据库中,但不在此处,则该函数可以工作。我认为代码中定义的方法可以在LINQ where子句中提供的值上工作,但不能在sql表列上工作。另外,DateTime。现在包含秒数,因此只有当两个DateTime等于秒数时,相等的秒数才有效。那么,我可以使用switch case语句或其他方法来处理此查询吗?
var viewModel = (from o in db.Sepet
join q2 in db.Urunler on o.urun_id equals q2.urun_id
join m in db.Markalar on q2.marka_id equals m.marka_id
where (o.sepet_id == bskt_id && o.statu == 0)
let fiyat = q2.gununfirsati == DateTime.Today
? q2.kampanyafiyati
: q2.urun_fiyat
select new SepetView
{
urun_id = q2.urun_id,
urun_resmi = q2.resimlink,
urun_link = q2.urun_link,
urun_adi = q2.urun_adi,
urun_fiyat = fiyat,
adet = o.adet,
sepettutari = (o.adet * fiyat),
marka_adi = m.marka_adi,
}).ToList();