Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在LINQ和EntityFramework中使用ToList()不支持异常_C#_.net_Linq_Entity Framework - Fatal编程技术网

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