首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq To Entities 'Only primitive types or enumeration types To‘错误

Linq To Entities 'Only primitive types or enumeration types To‘错误
EN

Stack Overflow用户
提问于 2013-03-24 05:04:26
回答 4查看 33.6K关注 0票数 8

我正在使用LinqPad测试我的查询。当LInqPad连接到我的数据库(从LInq到SQL)时,这个查询可以工作,但是当我将连接更改为使用Entity Framework5 Model.dll时,这个查询就不能工作了。(链接到实体)。这是在C#中。

我有两个表,名为Plan和PlanDetails。关系是多个PlanDetails的一个计划。

代码语言:javascript
复制
var q = from pd in PlanDetails
        select new {
            pd.PlanDetailID,
            ThePlanName = (from p in this.Plans
                    where p.PlanID == pd.PlanID
                    select p.PlanName)
        };
var results = q.ToList();
q.Dump(); //This is a linqpad method to output the result.

我收到这个错误:"NotSupportedException:无法创建'Domain.Data.Plan‘类型的常量值。在这个上下文中只支持原语类型或枚举类型。“你知道为什么这只适用于Linq to SQL吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-24 05:15:50

基本上,这意味着您在查询中使用了一些复杂的数据类型进行比较。在你的案例中,我怀疑from p in this.Plans where p.PlanID == pd.PlanID是罪魁祸首。

它依赖于DataProvider。它可能适用于Sql数据提供程序,但不适用于SqlCE数据提供程序等。

您应该做的是将this.Plans集合转换为仅包含Ids的原始类型集合。

代码语言:javascript
复制
var integers = PlanDetails.Plans.Select(s=>s.Id).ToList();

然后在里面使用这个列表。

代码语言:javascript
复制
var q = from pd in PlanDetails
        select new {
            pd.PlanDetailID,
            ThePlanName = (from p in integers
                    where p == pd.PlanID
                    select pd.PlanName)
        };
票数 20
EN

Stack Overflow用户

发布于 2015-07-16 16:33:04

当我尝试对实体框架表达式中的导航属性进行null检查时,我遇到了此错误

我通过在表达式中不使用not null检查,只使用Any()函数解决了这个问题。

代码语言:javascript
复制
  protected Expression<Func<Entities.Employee, bool>> BriefShouldAppearInSearchResults(
        IQueryable<Entities.Employee> briefs, string username)
    {
       var trimmedUsername = NameHelper.GetFormattedName(username);

        Expression<Func<Entities.Employee, bool>> filterExpression = cse =>                
             cse.Employee.Cars.All(c => 
                 c.Employee.Cars!=null &&  <--Removing this line resolved my issue
                 c.Employee.Cars.Any(cur => cur.CarMake =="Benz")));

        return filterExpression;
    }

希望这对某些人有帮助!

票数 5
EN

Stack Overflow用户

发布于 2013-03-24 05:19:08

这是一个Linqpad的bug,如果你喜欢的话(或者说是独有的)。我自己也发现了类似的行为。和我一样,您可能会发现您的查询可以使用ObjectContext,但不能使用DbContext。(它可以在Visual Studio中运行)。

我认为这与Linqpad的内部结构有关。它将MergeAs (AppendOnly)添加到集合中,并且上下文是一个UserQuery,其中可能包含导致此错误的一些代码。

当您在Linqpad代码中创建新的上下文实例并对此实例运行查询时,代码确实可以工作,这一事实证实了这一点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15592042

复制
相关文章

相似问题

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