Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc LINQ to实体无法识别该方法,并且无法将该方法转换为存储表达式_Asp.net Mvc_Linq - Fatal编程技术网

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();