【问题标题】:How does the compiler determine which provider to use when using multiple Linq2 .... contexts?当使用多个 Linq2 .... 上下文时,编译器如何确定使用哪个提供程序?
【发布时间】:2014-11-25 19:07:07
【问题描述】:

基于这个问题:Why isn't it possible to combine LINQ to XML with LINQ to SQL? 我想知道编译器如何确定使用哪个 LINQ 提供程序。

问题中使用的是 Linq2Xml 和 Linq2Sql,编译器使用的是 Linq2Sql。我想知道为什么这是因为使用了两个提供程序:xml 和 sql。

有人能解释一下编译器如何知道使用哪一个吗?

【问题讨论】:

  • 你的意思是哪个provider
  • 是的,也许这是一个更好的描述
  • 我认为它与编译器无关,它是运行时的事情。查询将使用您正在查询的集合的 linq 提供程序执行。在您的示例中,unitOfWork.TaxForms 看起来像 DbSet,因此 Single() 中的表达式变成了 Sql。

标签: c# linq


【解决方案1】:

Linq 方法有不同的重载。其中一些在IEnumerable<T> 上运行,其中一些是IQueryable<T>.IEnumerable<T> 方法用于Linq to Objects、Linq to Xml 等。

IQueryable<T> 另一方面是为查询提供者创建的。来自MSDN

IQueryable<T> 接口旨在由查询提供者实现。

这个接口继承了IEnumerable<T>接口,所以如果它 表示一个查询,可以枚举该查询的结果。 枚举强制与一个关联的表达式树 IQueryable<T> 要执行的对象。不返回的查询 当Execute<TResult>(Expression) 时执行可枚举的结果 方法被调用。“执行表达式树”的定义特定于查询提供程序。例如,它可能涉及将表达式树转换为适合底层数据源的查询语言。

这就是它们的区别所在。但是编译器实际上与此无关,查询的执行完全取决于您运行查询的源。例如在Linq to SQL中,假设您有一个dbContext.Users,它会返回一个IQueryable<T>所以您在此对象上调用的方法将使用 IQueryable<T> 重载,并且它们可以通过 Linq to SQL 查询提供程序转换为 SQL。如果您通过调用AsEnumerable 或其他linq 方法(ToListToArray)将它们变成IEnumerable<T>,则将从DB 中获取结果,其余查询将使用Linq 在内存中执行对象。

【讨论】:

  • 非常感谢。我想我明白。 LINQ 中关于 IEnumerable 与 IQueryable 的解释对我帮助很大。
猜你喜欢
  • 2011-02-17
  • 1970-01-01
  • 2013-01-04
  • 2022-10-21
  • 2019-12-01
  • 1970-01-01
  • 2023-03-19
  • 2012-04-30
  • 2021-05-29
相关资源
最近更新 更多