合并Linq查询

本文关键字:查询 Linq 合并 | 更新日期: 2023-09-27 18:11:25

有人能告诉我当我执行这个查询时会发生什么吗

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

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

我有以下类"Product",它实现了IProducts接口

public class Product
{
    public string Name { get; set; }
    public string Price { get; set; }
    public IQueryable<Product> Products
    {
        get
        {
            using(/*Connect to dtabase*/)
            {
                var products = from p in db.Products
                               select p;
            }
        }
    }
}

现在我添加了

ninjectKernel.Bind<IProducts>().To<Product>();

我想知道如果我添加了另一个Linq查询,如where product.Name == Something

会发生什么例如

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;
     }
}

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

例如

from p in db.Products
where p.Name == Something
select p;

谁来确认一下我写的对不对

合并Linq查询

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

。: -

from p in db.Products
    select p;

代表
db.Products.Select(p => p);

from p in repository.Products    // .Products is missing in your code
    where p.Name == productName
    select p

代表
repository.Products.Where(p => p.Name == productName);

现在,由于执行是延迟的,当我们枚举最终值('loop through data')时,以下语句将有效地执行:-

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

然后归结到IQueryable<T> (db.Products)的具体实现,将其转换为适当的任何内容。对于Linq2SQL提供程序,这将类似于:-

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

因此,由于延迟执行,对数据库的单个查询的转换是为您完成的。你不需要采取任何特殊的行动来实现这一点。