合并Linq查询

时间:2011-10-15 15:19:05

标签: c# linq linq-to-sql ninject

有人可以解释一下我执行此查询时会发生什么

我正在使用(阅读学习)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;

如果我做对了,有人可以确认我

1 个答案:

答案 0 :(得分:2)

编译器将有效将声明性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);

现在,因为执行被推迟,当我们枚举我们的最终值('循环数据')时,将有效地执行以下操作: -

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"

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