Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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/5/bash/15.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# c理解LINQ查询中的AsEnumerable_C#_Linq - Fatal编程技术网

C# c理解LINQ查询中的AsEnumerable

C# c理解LINQ查询中的AsEnumerable,c#,linq,C#,Linq,以下代码: var mids = _db.Members .GroupBy(m => new { m.MemberID, m.CreatedDate }) .Where(m => m.All(s => s.Status == 1) && m.Key.CreatedDate.Date == DateTime.Today) .Select(m=>m); 我得到一个运行时错误:LINQ to实体中不支持指定的类型成员“Date”。

以下代码:

var mids = _db.Members
     .GroupBy(m => new { m.MemberID, m.CreatedDate })
     .Where(m => m.All(s => s.Status == 1) && m.Key.CreatedDate.Date == DateTime.Today)
     .Select(m=>m);
我得到一个运行时错误:LINQ to实体中不支持指定的类型成员“Date”。仅支持初始值设定项、实体成员和实体导航属性

当我将_db.Members.AsEnumerable添加到第一行时,它会起作用

我的理解是,AsEnumerable强制在客户端执行查询。因此,在上面的代码中,一个可数运算符将查询分为两部分,在服务器端选择,其余部分在客户端按,其中


有人能验证我的理解是否正确吗?为什么代码在没有.AsEnumerable的情况下失败?

您的理解是正确的。调用AsEnumerable后,无法再查询数据源,它会返回到一种简单的“一切都给我”模式,这意味着所有数据都会传输到客户端,任何进一步的操作都会在本地完成

这也是查询无法按编写的方式工作的原因:为了使其工作,LINQ方法中使用的所有表达式都必须能够翻译为数据源能够理解的任何语言——而且由于翻译是用户的责任,因此您还将受到编程支持的任何语言的约束

在此特定情况下,假设EF可以通过手动替换对规范函数的属性访问,将查询固定为可查询模式:

当您想要切换到LINQ to对象时,经常使用AsEnumerable,这主要是因为您想要使用LINQ to实体不支持的一些功能。当您使用AsEnumerable时,您正在转换为IEnumerable,它基本上将处理从包含所有数据和索引等的数据源转移到您的应用程序。换句话说,如果不使用AsEnumerable,LINQtoEntities将把查询转换为SQL,并在数据源中远程执行。如果你想看到更多关于这个主题的信息,我建议你阅读这篇文章


正如Jon所说,Entity Framework提供了一组用于处理日期的函数,这些函数可以直接转换为SQL,它们位于EntityFunctions命名空间中。这些映射到所谓的规范函数,这意味着有1:1的SQL转换

是的,你是对的。另一方面,您不能使用linq和sql语法来比较这样的日期,不是吗?本的帖子中提到了。谢谢乔恩的解释。因此,如果使用EF,您会建议使用您的方法,因为条件将在数据源上执行,它将在服务器端执行?对的如果使用AsEnumerable,它将返回所有信息,并将返回附加信息。。更多可能没有用处的数据。@Landeeyo EntityFunctions适用于任何基于实体的系统,其中Linq2Entitys和EF都是。重要的是,您的提供程序知道如何理解默认提供程序所做的函数调用。@Ben是的,如果您能做到这一点,您总是希望在服务器上执行。您能分享一个我将使用的场景吗。AsEnumerable?如果你知道一篇好文章,请分享。谢谢你的帮助。
.Where(m => m.All(s => s.Status == 1) 
    && EntityFunctions.TruncateTime(m.Key.CreatedDate) ==
       EntityFunctions.TruncateTime(CurrentDateTime()))