C# 合并Linq查询

C# 合并Linq查询,c#,linq,linq-to-sql,ninject,C#,Linq,Linq To Sql,Ninject,有人能解释一下当我执行这个查询时会发生什么吗 我正在使用(阅读学习)ninject并有以下代码 public interface IProducts { IQueryable<Product> Products { get; } //some functions } 据我所知,Linq查询只有在我循环遍历数据时才会执行,所以我想知道这两个Linq查询是否会合并为一个 比如说 public class ProductController : Controller {

有人能解释一下当我执行这个查询时会发生什么吗

我正在使用(阅读学习)ninject并有以下代码

public interface IProducts
{
    IQueryable<Product> Products { get; }

   //some functions

}

据我所知,Linq查询只有在我循环遍历数据时才会执行,所以我想知道这两个Linq查询是否会合并为一个

比如说

public class ProductController : Controller
{
    private IProducs repository;

    public ProductController(IProducts products)
    {
         repository = products;
    }

    public ViewResult Find(string productName)
    {
          var product = from p in repository
                         where p.Name == productName
                         select p;
     }
}
from p in db.Products
where p.Name == Something
select p;
有没有人能确认一下我是否正确

编译器将有效地将您的声明性LINQ语句转换为方法调用。(我之所以说有效,是因为实际上取决于编译器内部,方法转换是否真的发生,或者它是否直接“捷径”到IL——在这种情况下,这对我们来说并不重要。)

即:-

from p in db.Products
    select p;
代表

db.Products.Select(p => p);
repository.Products.Where(p => p.Name == productName);

代表

db.Products.Select(p => p);
repository.Products.Where(p => p.Name == productName);
现在,由于执行被延迟,当我们枚举最终值(“循环数据”)时,将有效地执行以下操作:-

db.Products.Select(x => x).Where(p => p.Name == productName);
然后是
IQueryable
db.Products
)的具体实现,以将其转换为适当的内容。对于Linq2SQL提供程序,这将类似于:-

SELECT
    P.Name, P.Foo, P.Bar, ...
FROM
    Product P
WHERE
    P.Name = "the name you specify"

因此,您可以看到,由于延迟执行,针对数据库的单个查询的转换已经为您完成。您不必采取任何特殊措施来实现这一点。

在您的
IQueryable Products
属性中,您可以创建并处理一个新的上下文。换句话说,您返回一个引用已处理上下文的
IQueryable
。这将失败。此时无法处理上下文。此外,当您想要组合多个
IQueryable
s时,必须重用相同的上下文。您应该将
IProducts
重命名为
IProductRepository
。这是正确的术语。这使得其他开发人员更容易理解它的功能,“所以我想知道这两个Linq查询是否会合并为一个”。你为什么不试试这个?您可以使用SQL探查器查看发送到数据库的查询。我将把它作为一个单独的项目进行尝试,但我不太明白我应该做什么才能使它只成为一个查询。如果您想在存储库模式中使用依赖项注入,请看一看。它描述了一种实现此功能的有效方法。有关详细说明,请参阅Thx:))不客气。我认为,如果将操作表示为方法调用而不是声明性LINQ语法,则更容易想到这种事情。这也是我喜欢将代码编写为方法调用的原因之一。事实上,我根本不使用声明性LINQ语法。
SELECT
    P.Name, P.Foo, P.Bar, ...
FROM
    Product P
WHERE
    P.Name = "the name you specify"