在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#,所以我不是这里的专家。

在C#中使用lambdas LINQ查询

假设您在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字段应为索引字段。