代码之家  ›  专栏  ›  技术社区  ›  Jean-Francois

LINQ to Entities不识别该方法的系统Linq IQueryable[副本]

  •  7
  • Jean-Francois  · 技术社区  · 14 年前

    当我试图在子选择中调用我的存储库时,出现了这个错误。

     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<GrpText> FindAllLangTxtById(int GrpID);
    }
    
    public class GrpTextRepository : IGrpTextRepository
    {
        DBEntities db = new DBEntities();
    
        public IQueryable<GrpText> 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);
        }
    
    
    }
    

    这是完整的错误信息

    1 回复  |  直到 14 年前
        1
  •  14
  •   Ian Mercer    11 年前

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

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

    但是我不得不问,为什么在群体和文本之间没有FK关系,因此在两者之间没有实体关联,允许你仅仅访问 gh.GrpText 并访问延迟加载(或使用.Include()急切加载)的文本集合。

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