将方法放在where子句中时Linq错误:

时间:2013-08-03 21:43:15

标签: linq entity-framework linq-to-entities

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

谢谢!

1 个答案:

答案 0 :(得分:2)

LinqToEntities将尝试将查询中的所有条件转换为SQL。由于它无法直接将getPrefixBySize转换为SQL,因此整个查询都会失败。

您有几个选择:

  1. 获取超出您需要的数据,并使用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();
    
  2. 将对getPrefixBySize的调用替换为可以转换为SQL的内联函数(如果可能),例如基本值比较等。