草庐IT

c# - 什么是 LINQ,它有什么作用?

coder 2023-07-07 原文

很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center .




8年前关闭。




什么是LINQ?我知道它用于数据库,但它有什么作用?

最佳答案

LINQ代表语言集成查询。

Microsoft 语言开发人员没有编写 YAQL(另一种查询语言),而是提供了一种直接用他们的语言(例如 C# 和 Visual Basic)表达查询的方法。形成这些查询的技术不依赖于被查询事物的实现细节,因此您可以针对许多目标(数据库、内存中对象、XML)编写有效的查询,而实际上无需考虑查询将被执行。

让我们从属于 .NET Framework (3.5) 的部分开始这个探索。

  • LINQ 到对象 - 检查 System.Linq.Enumerable对于查询方法。这些目标IEnumerable<T> ,允许以类型安全的方式查询任何类型化的可循环集合。这些查询依赖于编译的 .NET 方法,而不是表达式。
  • LINQ 到任何东西 - 检查 System.Linq.Queryable对于一些查询方法。这些目标IQueryable<T> ,允许构建可由底层实现转换的表达式树。
  • 表达式树 - 检查 System.Linq.Expressions命名空间。这是代码即数据。在实践中,您应该了解这些内容,但实际上并不需要针对这些类型编写代码。语言特性(例如 lambda 表达式)可以让您使用各种简写来避免直接处理这些类型。
  • LINQ To SQL - 检查 System.Data.Linq命名空间。特别注意 DataContext .这是一种由 C# 团队构建的 DataAccess 技术。它只是有效。
  • LINQ To Entities - 检查 System.Data.Objects命名空间。特别注意 ObjectContext .这是 ADO.NET 团队构建的 DataAccess 技术。它比 LINQ To SQL 复杂、强大且更难使用。
  • LINQ To XML - 检查 System.Xml.Linq命名空间。从本质上讲,人们对 System.Xml 中的内容并不满意。 .所以微软重新编写了它,并利用重新编写的优势引入了一些方法,可以更容易地针对 XML 使用 LINQ To Objects。
  • 一些不错的辅助类型,例如 FuncAction .这些类型是具有通用支持的委托(delegate)。声明自己的自定义(且不可互换)委托(delegate)类型的日子已经一去不复返了。

  • 以上所有内容都是 .NET Framework 的一部分,可用于任何 .NET 语言(VB.NET、C#、IronPython、COBOL .NET 等)。

    好的,关于语言功能。我将坚持使用 C#,因为这是我最了解的。 VB.NET 也有几个类似的改进(还有一些 C# 没有得到 - XML 文字)。这是一个简短且不完整的列表。
  • 扩展方法 - 这允许您“添加”要键入的方法。该方法实际上是传递类型实例的静态方法,并且仅限于类型的公共(public)契约,但是对于向您不控制的类型(字符串)或添加(完全实现)的类型添加方法非常有用) 接口(interface)的辅助方法。
  • 查询理解语法 - 这允许您编写类似 SQL 的结构。所有这些内容都被转换为 System.Linq.Queryable 或 System.Linq.Enumerable 上的方法(取决于 myCustomers 的类型)。它是完全可选的,没有它您也可以很好地使用 LINQ。这种查询声明风格的一个优点是范围变量是有作用域的:不需要为每个子句重新声明它们。
    IEnumerable<string> result =
     from c in myCustomers
     where c.Name.StartsWith("B")
     select c.Name;
    
  • Lambda 表达式 - 这是指定方法的简写。 C# 编译器会将每个转换为匿名方法或真正的 System.Linq.Expressions.Expression .你真的需要了解这些才能很好地使用 Linq。共有三部分:参数列表、箭头和方法体。
    IEnumerable<string> result = myCustomers
     .Where(c => c.Name.StartsWith("B"))
     .Select(c => c.Name);`
    
  • 匿名类型 - 有时编译器有足够的信息来为你创建一个类型。这些类型并不是真正匿名的:编译器在生成它们时命名它们。但是这些名称是在编译时生成的,开发人员在设计时使用该名称为时已晚。
    myCustomers.Select(c => new 
    {
      Name = c.Name;
      Age = c.Age;
    })
    
  • 隐式类型 - 有时编译器从初始化中获得足够的信息,可以为您找出类型。您可以使用 var 关键字指示编译器这样做。隐式类型需要为匿名类型声明变量,因为程序员可能不会使用匿名类型的名称。
    // The compiler will determine that names is an IEnumerable<string>
    var names = myCustomers.Select(c => c.Name);
    
  • 关于c# - 什么是 LINQ,它有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/471502/

    有关c# - 什么是 LINQ,它有什么作用?的更多相关文章

    1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

      我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

    3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

      我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

    4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    5. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

      为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

    6. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

      它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

    7. ruby - Infinity 和 NaN 的类型是什么? - 2

      我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

    8. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

      如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

    9. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

      关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

    10. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

      我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

    随机推荐