在C#中使用lambdas LINQ查询

时间:2015-12-12 22:15:13

标签: c# linq lambda

我仍在将我们的网络应用程序从vb转换为C#和这个复杂的查询,我刚刚完成转换并经过测试并且工作正常,需要重构。

如果使用lambdas,这部分可能会表现得更好(我已经在很多地方读过lambda表达式执行得更快)

COPY sites-enabled/petersouter.co.uk.conf /etc/nginx/sites-available/petersouter.co.uk.conf

正如你所看到的,我已经在我认为合适的地方添加了lambdas,但我确信它们也可以在这个表达式的其他部分。我还在C#中加快速度,所以我不是这里的专家。

2 个答案:

答案 0 :(得分:0)

假设您在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 / method语法和查询语法之间没有性能差异,但是,这会稍微好一点,因为它会丢弃.ToList(),这将允许循环开始处理从数据库中获取第一条记录而不是等待整个结果(并且不需要创建List)。我也通过使用.Contains而不是子查询来简化它,并切换到使用导航属性而不是显式连接,这使得它更容易阅读/更易于维护。

答案 1 :(得分:0)

为了清晰的代码,我宁愿重构它,如下所示;

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字段应为索引字段。