首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq - EntityFramework NotSupportedException

Linq - EntityFramework NotSupportedException
EN

Stack Overflow用户
提问于 2016-01-26 13:11:10
回答 1查看 1K关注 0票数 1

我有一个类似这样的查询:

代码语言:javascript
复制
var caseList = (from x in context.Cases
         where allowedCaseIds.Contains(x => x.CaseId)
         select new Case {
            CaseId = x.CaseId,
            NotifierId = x.NotifierId,
            Notifier = x.NotifierId.HasValue ? new Notifier { Name = x.Notifier.Name } : null // This line throws exception
         }).ToList();

一个Case类可以有0..1 Notifier

上面的查询将导致以下System.NotSupportedException

无法创建“Models.Notifier”类型的空常量值。在此上下文中只支持实体类型、枚举类型或基本类型。

目前,我找到的唯一解决办法是在查询之后循环查询结果,然后手动填充Notifier,如下所示:

代码语言:javascript
复制
foreach (var c in caseList.Where(x => x.NotifierId.HasValue)
{
    c.Notifier = (from x in context.Notifiers 
                 where x.CaseId == c.CaseId
                 select new Notifier {
                     Name = x.Name
                 }).FirstOrDefault();
}

但是我真的不想这样做,因为在我的实际场景中,它会生成数百个额外的查询。

对这种情况有什么可能的解决办法吗?

EN

回答 1

Stack Overflow用户

发布于 2016-01-26 13:20:08

我觉得你应该分两步做。首先,您只能在一个查询中使用匿名类型获取所需的数据:

代码语言:javascript
复制
var caseList = (from x in context.Cases
     where allowedCaseIds.Contains(x => x.CaseId)
     select new {
        CaseId = x.CaseId,
        NotifierId = x.NotifierId,
        NotifierName = x.Notifier.Name
     }).ToList();

之后,您可以在内存中工作:

代码语言:javascript
复制
List<Case> cases = new List<Case>();
foreach (var c in caseList)
{
    var case = new Case();
    case.CaseId = c.CaseId;
    case.NotifierId = c.NotifierId;
    case.NotifierName = c.NotifierId.HasValue ? c.NotifierName : null;
    cases.Add(case);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35014610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档