如何在C#中通过Lambda查询获取最大值?

时间:2018-11-08 22:45:00

标签: c# lambda

我想使用查询Lambda来获取C#代码列中的最后一个数字。请注意,我想要一个数值,而不是一个列表。例如,如果最后一个注册号码是50,我希望这个号码是50。也就是说,我们可以将查询结果存储在数值变量中,以便在其他地方使用

var maxcode= dbContext.personel
                      .Select(a => a.Max(w => w.code))
                      .FirstOrDefault();

例如

 code name     old
 -----------------
 1    Amelia   18
 2    Olivia   27 
 3    Emily    11
 4    Amelia   99

我想得到4号

是否要使用top(1)来提高速度?

2 个答案:

答案 0 :(得分:3)

这应该有效:

var max = dbContext.personel.Max(x => x.code);

答案 1 :(得分:1)

尽管SQL和LINQ有一些相似之处,但是它们的工作方式却大不相同。最好从IEnumerable如何处理这种类型的查询开始,然后再将其转换为IQueryable。在大多数情况下,根据设计,两者看起来完全相同。

Select的{​​{1}}扩展遍历该序列,并将每个对象传递给提供的函数,将结果收集到适当类型的新IEnumerable中。在您的代码中,IEnumerable将是一个记录而不是一个集合。

本质上a看起来像这样:

Select

简单地说,public static IEnumerable<TResult> Select<TElement, TResult>(this IEnumerable<TElement> seq, Func<TElement, TResult> selector) { foreach (var item in seq) yield return selector(item); } 是一种转换。它接受一种类型的对象,并将它们通过转换函数传递。

Select扩展名-至少是相关的扩展名-处理一系列对象,使用提供的函数从每个对象中提取一些值,然后返回这些值中的最大值。看起来有点像下面的伪代码:

Max

可以编译,但可以显示基本概念。

因此,如果您的内存中有public static TResult Max<TElement, TResult>(this IEnumerable<TElement> seq, Func<TElement, TResult> valueFunc) { var result = default(TResult); foreach (var item in seq) { var curr = valueFunc(item); if (result == default(TResult) || result < curr) result = curr; } return curr; } 个对象数组,并且想找到最大的Personel,则可以这样做:

code

关于LinqToSQL和几乎所有类似LINQ的ORM(实体框架,LinqToDB等)的好处是,完全相同的事情适用于var maxCode = personel.Max(p => p.code);

IQueryable

实际的SQL看起来像(LinqToDB代码生成的实际输出):

var maxCode = dbContext.personel.Max(p => p.code);

对于更有趣的查询,语法不同。

您有两个SELECT Max([t1].[code]) as [c1] FROM [personel] [t1] 个条目,它们的年龄不同。假设您要查找列表中每个姓名的年龄范围。这是分组的来源。

在LINQ查询语法中,查询看起来像这样:

Amelia

以这种格式分组更容易。流利的样子更像是:

var nameAges = 
    from p in dbContext.personel
    group p.old by p.name into grp
    select new { name = grp.Key, lowAge = grp.Min(), highAge = grp.Max() };

或在SQL中:

var nameAges = dbContext.personel
    .GroupBy(p => p.name, p => p.old)
    .Select(grp => new { name = grp.Key, lowAge = grp.Min(), highAge = grp.Max() };

道德是,编写LINQ查询与编写SQL查询不是相同的……但是概念是相似的。和他们一起玩耍,弄清楚他们是如何工作的。一旦了解了LINQ,它就是一个很好的工具。