我想知道 IQueryable、List、IEnumerator 之间的区别是什么以及我应该何时使用它们?
例如,当使用 Linq to SQL 时,我会做这样的事情:
public List<User> GetUsers()
{
return db.User.where(/* some query here */).ToList();
}
最佳答案
IQueryable<T>旨在允许查询提供程序(例如,像 LINQ to SQL 或 Entity Framework 这样的 ORM)使用查询中包含的表达式将请求转换为另一种格式。换句话说,LINQ-to-SQL 会查看您正在使用的实体的属性以及您正在进行的比较,并实际创建一个 SQL 语句来表达(希望如此)一个等效的请求。IEnumerable<T>比 IQueryable<T> 更通用(尽管 IQueryable<T> 的所有实例都实现了 IEnumerable<T> )并且只定义了一个序列。但是,在 Enumerable 中有可用的扩展方法。在该接口(interface)上定义一些查询类型运算符并使用普通代码来评估这些条件的类。List<T>只是一种输出格式,虽然它实现了 IEnumerable<T> , 与查询没有直接关系。
换句话说,当您使用 IQueryable<T> 时,您正在定义一个可以转换为其他内容的表达式。即使您正在编写代码,该代码也永远不会被执行,它只会被检查并转换为其他内容,例如实际的 SQL 查询。因此,在这些表达式中只有某些内容是有效的。例如,您不能调用从这些表达式中定义的普通函数,因为 LINQ-to-SQL 不知道如何将您的调用转换为 SQL 语句。不幸的是,大多数这些限制只在运行时评估。
当您使用 IEnumerable<T>对于查询,您使用的是 LINQ-to-Objects,这意味着您正在编写用于评估查询或转换结果的实际代码,因此通常对您可以执行的操作没有限制。您可以从这些表达式中自由调用其他函数。
使用 LINQ to SQL
结合上述区别,记住这在实践中是如何运作的也很重要。当您针对 LINQ to SQL 中的数据上下文类编写查询时,它会生成 IQueryable<T> .无论你对 IQueryable<T> 做什么本身将变成 SQL,因此您的过滤和转换将在服务器上完成。无论你做什么反对这个 IEnumerable<T> ,将在应用程序级别完成。有时这是可取的(例如,在您需要使用客户端代码的情况下),但在许多情况下这是无意的。
例如,如果我有一个带有 Customers 的上下文代表 Customer 的属性表,每个客户都有一个 CustomerId列,让我们看看执行此查询的两种方法:
var query = (from c in db.Customers where c.CustomerId == 5 select c).First();
这将生成查询数据库 Customer 的 SQL。用 CustomerId 记录等于 5. 类似于:select CustomerId, FirstName, LastName from Customer where CustomerId = 5
现在,如果我们转动 Customers 会发生什么成IEnumerable<Customer>通过使用 AsEnumerable()扩展方法?var query = (from c in db.Customers.AsEnumerable() where c.CustomerId == 5 select c).First();
这种简单的改变带来了严重的后果。由于我们正在转弯Customers成IEnumerable<Customer> ,这将带回整个表并在客户端对其进行过滤(严格来说,这将带回表中的每一行,直到遇到符合条件的行,但重点是相同的)。IQueryable和 IEnumerable .这是因为它们是相似的、互补的接口(interface)。在这两种情况下,您都在定义一个查询;也就是说,您要定义在何处查找数据、应用哪些过滤器以及返回哪些数据。这两个都是查询query = from c in db.Customers where c.CustomerId == 5 select c;
query = from c in db.Customers.AsEnumerable() where c.CustomerId == 5 select c;
就像我们讨论过的,第一个查询是使用 IQueryable第二个使用 IEnumerable .然而,在这两种情况下,这只是一个查询。定义查询实际上不会对数据源执行任何操作。当代码开始迭代列表时,查询实际上会执行。这可以通过多种方式发生; foreach循环,调用 ToList() , 等等。ToList()在 query两次,您最终会得到两个具有完全不同对象的列表。它们可能包含相同的数据,但它们将是不同的引用。IQueryable<T>作为 IEnumerable<T> , 只有在它是 IEnumerable<T> 之后才进行查询将在客户端完成。例如,假设我有这个表和一个 LINQ-to-SQL 上下文:Customer
-----------
CustomerId
FirstName
LastName
我首先基于FirstName构造一个查询.这将创建一个 IQueryable<Customer> :var query = from c in db.Customers where c.FirstName.StartsWith("Ad") select c;
现在我将该查询传递给一个接受 IEnumerable<Customer> 的函数。并根据 LastName 进行一些过滤:public void DoStuff(IEnumerable<Customer> customers)
{
foreach(var cust in from c in customers where c.LastName.StartsWith("Ro"))
{
Console.WriteLine(cust.CustomerId);
}
}
我们在这里做了第二个查询,但它是在 IEnumerable<Customer> 上完成的。 .这里将要发生的是第一个查询将被评估,运行这个 SQL:select CustomerId, FirstName, LastName from Customer where FirstName like 'Ad%'
所以我们要带回所有 FirstName 的人以 "Ad" 开头.请注意,这里没有关于 LastName 的任何内容。 .那是因为它被客户端过滤掉了。LastName 的记录。以 "Ro" 开头.这样做的缺点是我们带回了数据——即所有 LastName 的行。不以 "Ro" 开头--可能已在服务器上过滤掉。
关于c# - IQueryable、List、IEnumerator 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4844660/
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev