我是LINQ的新手,在以下Where子句中放置方法时出现以下错误:
LINQ to Entities无法识别方法'System.String getPrefixBySize(Int32,Int32,Int32,Int32)'方法,并且此方法无法转换为商店表达式。
adminGalleryDesignerVM.Thumbnails = (from tn in db.Media
from fd in db.FileDescendants
where tn.GalleryId == galleryId && fd.FileId == tn.FileId
&& fd.Prefix == FM.getPrefixBySize(fd.FileId, 250, 250, 1)
select new FileVM
{
id = tn.MediaId,
FileName = tn.File.FileName,
URL = FM.getMediaURL(tn.FileId, fd.Prefix),
Height = fd.FileHeight,
Width = fd.FileWidth
}).ToList();
谢谢!
答案 0 :(得分:2)
LinqToEntities将尝试将查询中的所有条件转换为SQL。由于它无法直接将getPrefixBySize
转换为SQL,因此整个查询都会失败。
您有几个选择:
获取超出您需要的数据,并使用Linq-to-Objects过滤更多内容:
adminGalleryDesignerVM.Thumbnails = (
from tn in db.Media
from fd in db.FileDescendants
where tn.GalleryId == galleryId && fd.FileId == tn.FileId
select new
{
id = tn.MediaId,
FileName = tn.File.FileName,
tn.FileId,
fd.Prefix,
Height = fd.FileHeight,
Width = fd.FileWidth
})
.AsEnumerable() // hydrate the query
.Where(x => x.Prefix == FM.getPrefixBySize(x.FileId, 250, 250, 1)
.Select(x => new FileVM
{
id = x.id,
FileName = x.FileName,
URL = FM.getMediaURL(x.FileId, x.Prefix),
Height = x.Height,
Width = x.Width
})
.ToList();
将对getPrefixBySize
的调用替换为可以转换为SQL的内联函数(如果可能),例如基本值比较等。