修改 LINQ 以获取前 5 个元素

本文关键字:元素 获取 LINQ 修改 | 更新日期: 2023-09-27 18:31:05

var lastArticles = from a in be.MyTable
                   where a.id == 1
                   join c in be.OtherTable on a.parent equals c.id
                   orderby a.timestamp descending
                   select new { a, cName = c.name};

我需要获取前 5 个元素。

我正在做

.Take(5)

但是有没有办法在 LINQ 语句中执行?

修改 LINQ 以获取前 5 个元素

不,您需要使用 Skip()Take() 作为方法调用。没有特定于 LINQ 的等效项。

var lastArticles = (from a in be.MyTable
                    where a.id == 1
                    join c in be.OtherTable on a.parent equals c.id
                    orderby a.timestamp descending
                    select new { a, cName = c.name }).Take(5);

linq 查询应始终与运行该查询的产品分开。

.Take()生成结果,因此应与查询分开且不同。

//data query
var lastArticlesQuery = from a in be.MyTable
                   where a.id == 1
                   join c in be.OtherTable on a.parent equals c.id
                   orderby a.timestamp descending
                   select new { a, cName = c.name};
//results of that query at this time
var lastArticles = lastArticlesQuery.Take(5);

这段代码只是合成糖,通常它将被转换为一个 LINQ 方法链,如下所示:

var lastArticles = be.MyTable
    .Where(a => a.id == 1)
    .Join(be.OtherTable, a => a.parent, c => c.id,
    (a, c) => new { a, c})
    .OrderByDescending(@t => @t.a.timestamp)
    .Select(@t => new { @t.a, cName = @t.c.name });

因此,拥有Take()关键字只会增加系统糖,并且也需要重新转换。

简而言之,不,唯一的方法是使用Take()方法。