Jea*_*ois 7 c# entity-framework
当我尝试在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(),
};
Run Code Online (Sandbox Code Playgroud)
我的界面是
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);
}
}
Run Code Online (Sandbox Code Playgroud)
这是完整的错误消息
System.NotSupportedException:LINQ to Entities无法识别方法'System.Linq.IQueryable`1 [aaa.Models.GrpText] FindAllLangTxtById(Int32)'方法,并且此方法无法转换为存储表达式.
Ian*_*cer 14
简单的解决方案是在select(...)之前添加.ToList().
ViewDet = _db.Grp.ToList().Select(gh => new MultiDetailViewModel ...)
Run Code Online (Sandbox Code Playgroud)
这样初始请求将转到数据库,返回结果,然后您可以使用针对Linq对象的select语句重新投影它们.
但我不得不问为什么组和文本之间没有FK关系,因此两者之间的实体关联允许您只是访问gh.GrpText并获取延迟加载的文本集合(或者使用.Include()急切加载).
正如@Doguhan Uluca在评论中指出的那样,使用ToList()是有风险的,因为它会导致该表中的所有内容被提取到内存中.你应该只在很小的集合上使用它.正确的方法是修复您的数据库设计,以便您可以有效地查询它.
| 归档时间: |
|
| 查看次数: |
19890 次 |
| 最近记录: |