C# 在LINQ和EntityFramework中使用ToList()不支持异常
我有一个如下的查询:C# 在LINQ和EntityFramework中使用ToList()不支持异常,c#,.net,linq,entity-framework,C#,.net,Linq,Entity Framework,我有一个如下的查询: var q = from x in db.Table1 where x.Timestamp.CompareTo(fromDate) >= 0 && x.Timestamp.CompareTo(toDate) < 0 select x; var q_list = q.ToList(); // this works fine
var q = from x in db.Table1
where x.Timestamp.CompareTo(fromDate) >= 0
&& x.Timestamp.CompareTo(toDate) < 0
select x;
var q_list = q.ToList(); // this works fine
var g = q.Where(z=> z.Table2.Equals(ns)); // ns is instance of Table2 not Table1
var g_list = g.ToList(); // this throws exception
我有很多这样的函数,我不想重复查询,我需要使用Where、GroupBy等其他函数
完整异常跟踪:
**
System.NotSupportedException未处理
消息=无法创建“DataAccessLayer.Model.Table2”类型的常量值。在此上下文中仅支持基本类型(“如Int32、String和Guid”)。
Source=System.Data.Entity
堆栈跟踪:
位于System.Data.Objects.Elink.ExpressionConverter.ConstantTranslator.TypedTranslate(ExpressionConverter父级,ConstantExpression linq)
位于System.Data.Objects.Elink.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter父级,表达式linq)
位于System.Data.Objects.Elink.ExpressionConverter.TranslateExpression(表达式linq)
位于System.Data.Objects.Elink.ExpressionConverter.EqualsTranslator.TypedTranslate(ExpressionConverter父级,二进制表达式linq)
位于System.Data.Objects.Elink.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter父级,表达式linq)
位于System.Data.Objects.Elink.ExpressionConverter.TranslateExpression(表达式linq)
位于System.Data.Objects.elink.ExpressionConverter.TranslateLambda(LambdaExpression lambda,DbExpression input)
位于System.Data.Objects.eliq.ExpressionConverter.TranslateLambda(LambdaExpression lambda、DbExpression input、DbExpressionBinding&binding)
位于System.Data.Objects.Elink.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter父级、MethodCallExpression调用、DbExpression和source、DbExpressionBinding和sourceBinding、DbExpression和lambda)
位于System.Data.Objects.Elink.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter父级,MethodCallExpression调用)
位于System.Data.Objects.Elink.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter父级,MethodCallExpression调用,SequenceMethod SequenceMethod)
位于System.Data.Objects.Elink.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter父级,MethodCallExpression linq)
位于System.Data.Objects.Elink.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter父级,表达式linq)
位于System.Data.Objects.Elink.ExpressionConverter.TranslateExpression(表达式linq)
在System.Data.Objects.Elink.ExpressionConverter.Convert()中
位于System.Data.Objects.elink.elinkQueryState.GetExecutionPlan(可为null `1 forMergeOption)
位于System.Data.Objects.ObjectQuery`1.GetResults(可为null`1 forMergeOption)
位于System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator()
位于System.Data.Entity.Internal.Linq.InternalQuery`1.GetEnumerator()处
位于System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator()
位于System.Collections.Generic.List`1..ctor(IEnumerable`1集合)
**问题在于EntityFramework不理解非原语的类型。你要做的是:
var g = q.Where(z => z.field.Id.Equals(ns.Id));
请记住,如果您有一个Equals
的自定义实现,则无法将其转换为正确的t-sql。如果仍要执行该实现,则需要在内存中执行:
// note it's using q_list instead of q
var g = q_list.Where(z => z.field.Equals(ns));
好的,
.ToList()
之所以要对异常负责,仅仅是因为它是实际“计算”LINQ表达式的一种方法(在许多方法中,例如.ToArray()
,.Single()
,等等)。在那之前,它甚至都不会进入数据库。在这一点上,有相当多的事情正在发生,其中一部分,显然是抛出这个例外。您能发布完整的异常/堆栈跟踪吗?谢谢@Saher发布堆栈跟踪。那么现在,z.field
的类型是什么?什么是字段
?然后伊沃维布洛是一个优秀的读心器。他答对了是的。谢谢你,柯克,你做了很棒的侦探工作!嘿,不如伊沃维布洛好我想我会凭身份证来做的。非常感谢
var g = q.Where(z => z.field.Id.Equals(ns.Id));
// note it's using q_list instead of q
var g = q_list.Where(z => z.field.Equals(ns));