我有一个返回此异常的方法。 LINQ to Entities无法识别方法'System.String stringCutter(System.String)'方法,并且此方法无法转换为商店表达式。
public List<ProductReqNoDate> GetRequestsQuery()
{
var query = (from r in db.talepler
select new ProductReqNoDate
{
talepEdenBirim = r.talepEdenBirim,
talepNo = r.talepNo,
talepTarihi = r.talepTarihi,
urunAdi = stringCutter((from p in db.urunler
where p.talepNo == r.talepNo
select p.urunAd).FirstOrDefault()) // <--This
}).AsQueryable();
return query.ToList();
}
string stringCutter(string txt)
{
return string.IsNullOrEmpty(txt) ? "" : txt.Length <= 30 ? txt : txt.Substring(0, 30) + "...";
}
当我使用这个字符串操作内联时,它的工作原理。但它太长了,
urunAdi = ((from p in db.urunler where p.talepNo == r.talepNo select p.urunAd).FirstOrDefault()).Length <= 30 ?
((from p in db.urunler where p.talepNo == r.talepNo select p.urunAd).FirstOrDefault()) :
((from p in db.urunler where p.talepNo == r.talepNo select p.urunAd).FirstOrDefault()).Substring(0, 30) + "..."
我如何引用(从db.urunler中的p,其中p.talepNo == r.talepNo选择p.urunAd).FirstOrDefault())作为txt可能;所以我可以使用stringCutter方法内联,如:
urunAdi=string.IsNullOrEmpty(txt) ? "" : txt.Length <= 30 ? txt : txt.Substring(0, 30) + "...";
有没有办法缩短这段代码。 ,谢谢
答案 0 :(得分:1)
EF正在尝试将函数stringCutter
映射到SQL。它不能,因为它不知道它。内联版本仅使用EF知道映射到SQL表达式/函数的函数。
答案 1 :(得分:0)
IQueryable<>
无法将您的表达式转换为与后端存储一起使用。你需要首先将一个字符串带入内存,然后你可以使用IEnumerable<>
的投影方法来调用你的方法,如下所示:
return (from r in db.talepler
select new // First, use an anonymous type to read the building blocks
{
r.talepEdenBirim,
r.talepNo,
r.talepTarihi,
urunAdiStr = (from p in db.urunler
where p.talepNo == r.talepNo
select p.urunAd).FirstOrDefault()
}
).AsQueryable()
.ToList() // Force the data into memory
.Select(anon => new ProductReqNoDate {
talepEdenBirim = anon.talepEdenBirim,
talepNo = anon.talepNo,
talepTarihi = anon.talepTarihi,
urunAdi = stringCutter(anon.urunAdiStr) // Now stringCutter is available
}).ToList();