合并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语句转换为方法调用。(我说是有效的,因为它实际上取决于编译器内部,方法转换是否实际发生,或者它是否直接"快捷"到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"
因此,由于延迟执行,对数据库的单个查询的转换是为您完成的。你不需要采取任何特殊的行动来实现这一点。