0

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

谢谢!

4

1 回答 1

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(如果可能)的内联函数,例如基本值比较等。

于 2013-08-03T22:20:40.877 回答