Csharp/C#教程:LINQ to Entities无法识别方法’System.Linq.IQueryable分享


LINQ to Entities无法识别方法’System.Linq.IQueryable

当我尝试在Sub Select中调用我的存储库时,出现了此错误。

IGrpTextRepository rep = new GrpTextRepository(); var query = new DetailViewModel { ViewDet = (from gh in _db.Grp select new MultiDetailViewModel { Header = gh, Txts = rep.FindAllLangTxtById(gh.GrpID) }).ToList(), Lang = _db.Language.ToList(), }; 

我的界面是

  public interface IGrpTextRepository { IQueryable FindAllLangTxtById(int GrpID); } public class GrpTextRepository : IGrpTextRepository { DBEntities db = new DBEntities(); public IQueryable FindAllLangTxtById(int GrpID) { return (from lang in db.Language join gtxts in db.GrpText on lang.LangID equals gtxts.LangID into jointxt from fintxt in jointxt.DefaultIfEmpty() where fintxt.GrpID == GrpID select fintxt); } } 

这是完整的错误消息
System.NotSupportedException:LINQ to Entities无法识别方法’System.Linq.IQueryable`1 [aaa.Models.GrpText] FindAllLangTxtById(Int32)’方法,并且此方法无法转换为商店表达式。

简单的解决方案是在select(…)之前添加.ToList()。

  ViewDet = _db.Grp.ToList().Select(gh => new MultiDetailViewModel ...) 

这样,初始请求将转到数据库,返回结果,然后您可以使用针对Linq对象的select语句重新投影它们。

但我不得不问为什么组和文本之间没有FK关系,因此两者之间的实体关联允许您只访问gh.GrpText并获取延迟加载的文本集合(或者急切加载使用。包括())。

正如@Doguhan Uluca在评论中指出的那样,使用ToList()是有风险的,因为它会导致该表中的所有内容被提取到内存中。 你应该只在很小的集合上使用它。 正确的方法是修复您的数据库设计,以便您可以有效地查询它。

上述就是C#学习教程:LINQ to Entities无法识别方法’System.Linq.IQueryable分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/989470.html

(0)
上一篇 2021年12月23日
下一篇 2021年12月23日

精彩推荐