在C#中使用lambdas LINQ查询
本文关键字:lambdas LINQ 查询 | 更新日期: 2023-09-27 18:26:37
我仍在将我们的web应用程序从vb转换为C#,而这个复杂的查询,我刚刚完成转换并进行了测试,它工作正常,需要重构。
如果使用lambda,本节可能会执行得更好(我在很多地方读到lambda表达式执行得更快)
foreach (var datapersymbol in (from symId in symblist
select (
from q in ctx.HistoricalPriceData.Where(q => q.SymbolId == symId)
join x in ctx.Symbols on q.SymbolId equals x.SymbolId
orderby q.Date descending
select new {q.Date, q.LastPrice, x.Symbol1})).ToList())
正如你所看到的,我在我认为合适的地方添加了lambda,但我确信它们也可以出现在这个表达式的其他部分。我还在学习C#,所以我不是这里的专家。
假设您在HistoricalPriceData上有一个名为"Symbol"的导航属性:
foreach(var datapersymbol in ctx
.HistoricalPriceData
.Where(h=>symblist.Contains(h.SymbolId))
.OrderByDescending(h=>h.Date)
.Select(h=>new {h.Date,h.LastPrice,h.Symbol.Symbol1}))
正如Rahul所指出的,lamda/方法语法和查询语法之间没有性能差异,但是,这将表现得稍微好一点,因为它删除了.ToList(),这将允许循环在从数据库中获得第一条记录后立即开始处理,而不是等待整个结果(而且它不需要创建List)。我还通过使用.Contains而不是子查询对其进行了一些简化,并切换到使用导航属性而不是显式联接,这使其更易于读取/更易于维护。
为了代码的清晰性,我宁愿像下面这样重构它;
var datapersymbols = from symId in symblist
select (
from q in ctx.HistoricalPriceData.Where(q => q.SymbolId == symId)
join x in ctx.Symbols on q.SymbolId equals x.SymbolId
orderby q.Date descending
select new {q.Date, q.LastPrice, x.Symbol1});
foreach (var datapersymbol in datapersymbols)
{
}
就我所见,在这种情况下,您从C#端获得的东西并不多。您必须检查SQL查询的查询计划,然后添加必要的索引。SymbolId
字段应为索引字段。