2013-03-23 119 views
3

我正在使用LinqPad来测试我的查询。这个查询在LInqPad连接到我的数据库(LInq到SQL)时起作用,但当我改变连接以使用我的Entity Framework 5 Model.dll时它不起作用。 (Linq to Entity)。这是用C#编写的。Linq支持实体'仅支持原始类型或枚举类型'错误

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

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?

回答

14

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

它取决于DataProvider。它可能适用于Sql Data Provider,但不适用于SqlCE数据提供程序等。

你应该做的是你this.Plans集合转换成一个只包含IDS即

var integers = PlanDetails.Plans.Select(s=>s.Id).ToList(); 

基本类型集合,然后里面使用这个列表。

var q = from pd in PlanDetails 
     select new { 
      pd.PlanDetailID, 
      ThePlanName = (from p in integers 
        where p == pd.PlanID 
        select pd.PlanName) 
     }; 
+3

我担心他为什么需要做一个嵌套查询,当他说一个计划到许多PlanDetails ..这意味着PlanDetails不能孤立..他们必须与计划有关...所以,如果你有一个PlanDetail它应该有一个叫做Plan的Navigational属性(如果没有重命名) – scartag 2013-03-23 21:18:13

+0

,他不需要做这个条件,但是为了这个错误。 – 2013-03-23 21:19:59

+0

谢谢!我一直在玩EF,这也是有道理的。我会在两个不相关的实体上进行尝试。 – duyn9uyen 2013-03-23 21:21:59

2

如果关系已经存在。

为什么不简单地说。

var q = from pd in PlanDetails 
     select new { 
      pd.PlanDetailID, 
      ThePlanName = pd.Plan.PlanName 
     }; 

当然,我假设每个PlanDetail都属于一个Plan。

更新

为了得到更好的结果,从LinqPad你可以告诉它使用的,而不是默认自己的组件(其中包含您的DbContext)的DataContext它使用。

+0

你是如此的正确。我完全忘记了Navigational财产。你能告诉我刚开始使用EF吗?谢谢! – duyn9uyen 2013-03-23 21:18:52

3

这是一个Linqpad错误,如果你喜欢(或特殊)。我自己也发现了类似的行为像我一样,您可能会发现您的查询可以使用ObjectContext,但不能使用DbContext。 (它在Visual Studio中有效)。

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

这是通过代码确实在您在Linqpad代码中创建新的上下文实例并针对此实例运行查询时发挥作用的。

+0

您的回答帮助我的!即使有一个简单的'select new'子句,我也有类似的问题,我只需创建自己的类的实例,其属性是对实体的引用(不带另一个嵌套的'from'子句)。使用我自己的上下文实例,它也在LINQPad中工作(因为它已经在VS中)。 – juniper 2013-11-18 09:47:00

0

我当我试图为null检查的实体框架表达

我不使用表达式中的NOT NULL检查,只用任何()函数只解决这一个导航属性此错误。

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; 
    } 

希望这可以帮助别人!

相关问题