【问题标题】:Linq error when placing method in the where clause:在 where 子句中放置方法时出现 Linq 错误:
【发布时间】:2013-08-03 21:43:15
【问题描述】:

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

谢谢!

【问题讨论】:

  • 那么getPrefixBySize的签名是什么。它告诉你它认为它应该是什么。

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


【解决方案1】:

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

【讨论】:

  • 谢谢!我选择了第一个解决方案。我只需要将方法转换为字符串,如下所示: .Where(x => x.Prefix == (string)FM.getPrefixBySize(x.FileId, 250, 250, 1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多