Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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 to实体无法识别该方法(分区/行号)_C#_Entity Framework_Linq - Fatal编程技术网

C# LINQ to实体无法识别该方法(分区/行号)

C# LINQ to实体无法识别该方法(分区/行号),c#,entity-framework,linq,C#,Entity Framework,Linq,我一辈子都搞不明白为什么这个查询没有运行 它可以正确编译,但在运行时尝试执行.ToList()时失败,错误如下所示 我已经回顾了类似的答案,但似乎每个答案都有其特定的问题 我将查询拆分为多行,试图缩小出错代码的范围,它似乎在“//分区结束后在线,并为每个分区生成行数”,但我无法理解 我借用了GroupBy/分区的逻辑: [DataContract(Name=“Checksum”)] 公共类校验和 { [DataMember(Name=“SortColumn”)] 公共日期时间排序列{get;s

我一辈子都搞不明白为什么这个查询没有运行

它可以正确编译,但在运行时尝试执行.ToList()时失败,错误如下所示

我已经回顾了类似的答案,但似乎每个答案都有其特定的问题

我将查询拆分为多行,试图缩小出错代码的范围,它似乎在“//分区结束后在线,并为每个分区生成行数”,但我无法理解

我借用了GroupBy/分区的逻辑:

[DataContract(Name=“Checksum”)]
公共类校验和
{
[DataMember(Name=“SortColumn”)]
公共日期时间排序列{get;set;}
[DataMember(Name=“Identifier”)]
公共字符串标识符{get;set;}
[DataMember(Name=“Seqnum”)]
public int Seqnum{get;set;}
}
公共void TestLinQ()
{
myObjectContext=新的myObjectContext();
DateTime startDate=新的日期时间();
IQueryable iQ=上下文。符号;
iQ=iQ.OrderBy(o=>o.LastUpdateTimeStamp);
iQ=iQ.Where(x=>x.LastUpdateTimeStamp==startDate);
//分区覆盖并为每个分区生成行数
IQueryable iQ2=iQ.GroupBy(x=>x.LastUpdateTimeStamp).Select(g=>new{g,count=g.count()}).SelectMany(t=>t.g.Select(b=>b).Zip(Enumerable.Range(1,t.count),(j,i)=>new校验和{SortColumn=j.LastUpdateTimeStamp,Identifier=j.SigninId,Seqnum=i});
iQ2=iQ2,其中(x=>x.Seqnum<1000);
//生成校验和码
List outlist=iQ2.ToList();
//结束生成校验和代码
}
结果消息:

测试方法WebRole1.Tests.ContinuationTokenTests.TestLinQ引发异常: System.NotSupportedException:LINQ to Entities无法识别方法'System.Collections.Generic.IEnumerable'1[WebRole1.Tests.Checksum]Zip[Signin,Int32,Checksum](System.Collections.Generic.IEnumerable'1[iSignRepo.Models.Signin],System.Collections.Generic.IEnumerable'1[System.Int32],System.Func`3[iSignRepo.Models.Signin、System.Int32、WebRole1.Tests.Checksum])方法,此方法无法转换为存储表达式


基本上,它无法将Zip转换为SQL

您所需要做的就是在使用该方法之前执行查询

IQueryable<Checksum> iQ2 = iQ.GroupBy(x => x.LastUpdateTimeStamp)
                             .Select(g => new { g, count = g.Count() })
                             .ToList() // Executes the Query
                             .SelectMany(t => t.g.Select(b => b).Zip(Enumerable.Range(1, t.count), (j, i) => new Checksum { SortColumn = j.LastUpdateTimeStamp, Identifier = j.SigninId, Seqnum = i }));
IQueryable iQ2=iQ.GroupBy(x=>x.LastUpdateTimeStamp)
.Select(g=>new{g,count=g.count()})
.ToList()//执行查询
.SelectMany(t=>t.g.Select(b=>b).Zip(可枚举的.Range(1,t.count),(j,i)=>new Checksum{SortColumn=j.LastUpdateTimeStamp,Identifier=j.SigninId,Seqnum=i});

看起来EF提供程序不知道如何将
Zip
转换为SQL。您可能必须在该点之前从数据库中获取数据,以便
Zip
在内存中执行。Yikes…我想根据Zip的结果限制数据集。因此,如果在.ToL时查询仍有150000条记录ist(),它会把它拉到服务器上,然后代码会在下一个查询部分减少它吗?希望这不会太贵。我会试试。谢谢!!根据你在.Zip方法中所做的,你可能会这样做。我建议打开一个关于如何将其转换为EF友好代码的新问题。是的,我想我必须这样做,这需要一个inordinate运行时间,当在straight SQL中完成时,它将在400毫秒内完成,而这已经超过了100秒。
IQueryable<Checksum> iQ2 = iQ.GroupBy(x => x.LastUpdateTimeStamp)
                             .Select(g => new { g, count = g.Count() })
                             .ToList() // Executes the Query
                             .SelectMany(t => t.g.Select(b => b).Zip(Enumerable.Range(1, t.count), (j, i) => new Checksum { SortColumn = j.LastUpdateTimeStamp, Identifier = j.SigninId, Seqnum = i }));