C# 合并Linq查询
有人能解释一下当我执行这个查询时会发生什么吗 我正在使用(阅读学习)ninject并有以下代码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 {
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"