我想使用查询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)来提高速度?
答案 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,它就是一个很好的工具。