我正在使用LinqPad测试我的查询。当LInqPad连接到我的数据库(从LInq到SQL)时,这个查询可以工作,但是当我将连接更改为使用Entity Framework5 Model.dll时,这个查询就不能工作了。(链接到实体)。这是在C#中。
我有两个表,名为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吗?
发布于 2013-03-24 05:15:50
基本上,这意味着您在查询中使用了一些复杂的数据类型进行比较。在你的案例中,我怀疑from p in this.Plans where p.PlanID == pd.PlanID是罪魁祸首。
它依赖于DataProvider。它可能适用于Sql数据提供程序,但不适用于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)
};发布于 2015-07-16 16:33:04
当我尝试对实体框架表达式中的导航属性进行null检查时,我遇到了此错误
我通过在表达式中不使用not null检查,只使用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;
}希望这对某些人有帮助!
发布于 2013-03-24 05:19:08
这是一个Linqpad的bug,如果你喜欢的话(或者说是独有的)。我自己也发现了类似的行为。和我一样,您可能会发现您的查询可以使用ObjectContext,但不能使用DbContext。(它可以在Visual Studio中运行)。
我认为这与Linqpad的内部结构有关。它将MergeAs (AppendOnly)添加到集合中,并且上下文是一个UserQuery,其中可能包含导致此错误的一些代码。
当您在Linqpad代码中创建新的上下文实例并对此实例运行查询时,代码确实可以工作,这一事实证实了这一点。
https://stackoverflow.com/questions/15592042
复制相似问题