8

我正在使用 LinqPad 来测试我的查询。当 LInqPad 连接到我的数据库(LInq 到 SQL)时,此查询有效,但当我更改连接以使用我的 Entity Framework 5 Model.dll 时,它不起作用。(链接到实体)。这是在 C# 中。

我有两个名为 Plan 和 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?

4

4 回答 4

20

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

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

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

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)
        };
于 2013-03-23T21:15:49.603 回答
5

当我尝试对实体框架表达式中的导航属性进行空检查时出现此错误

我通过不使用表达式中的非空检查而仅使用 Any() 函数来解决它。

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

希望这对某人有帮助!

于 2015-07-16T08:33:03.557 回答
3

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

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

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

于 2013-03-23T21:19:07.777 回答
2

如果关系已经存在。

为什么不简单的说。

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

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

更新

为了从 LinqPad 获得更好的结果,您可以告诉它使用您自己的程序集(其中包含您的 DbContext)而不是它使用的默认 Datacontext。

于 2013-03-23T21:12:24.510 回答