求教使用Linq查询表中某一列的最大值的时候,如果没有符合条件的结果怎么处理

时间:2021-01-28 15:11:32
double q = db.MenuInfo.Where(p => p.PID == PID).Max(p => p.IOrder);

当没有符合p.PID==PID条件的记录的时候,总是报错,该怎么做啊

6 个解决方案

#1


var query= db.MenuInfo.Where(p => p.PID == PID);
if(query.Any())
{
   double q = query.Max(p => p.IOrder); 
   ......
}
else
{
   ......
}

#2


即使你写T-SQL,也得写:

if exists(select * from MenuInfo where pid=@pid) 
  select max(pid) from MenuInfo 
else
  select ......

总之是要两步才可能得到结果的。

#3


不是吧,T-SQL,可以直接select max(pid) from MenuInfo  判断结果集是否为空,然后进行相应处理

按照1楼的写法,应该是执行了select * from menuinfo where pid=xx

然后再从内存结果集中去取最大值,这样效率上肯定是比较低的

#4


select max(pid) from MenuInfo 

当没有记录时,返回的不是空记录,而是字段值为NULL(数据库值)的记录,并不是空记录。

if exists(select * from MenuInfo where pid=@pid)  

这条的“效率”地多少呢?恐怕有些人一看到“select *”就发怵。"exits(select *"表达式并不查询所有记录,而是找到第一个记录就立刻返回。这是t-sql最推荐的做法,而使用“select max(fld)”然后去判断字段是否null没有多少优势,反倒逻辑容易看不清。

#5


在写t-sql存储过程时,如果逻辑是“为购买了价值最高的商品的顾客根据这个价格累计积分”,写这个存储过程就是要写

if exists(select * from ....  ) begin  --判断是否存在合格的
   declare @price decimal
   set @price=select max(价格) ......
   --为顾客可根据@price计算积分
end

本来首先判断简单一下“是否存在”是很快的,如果先去“select max(价格) ...”反而做了很多复杂的操作。


不过,这是SQL Server编程问题。我们回到Linq。如果写

double q = db.MenuInfo.Where(p => p.PID == PID).Max(p => p.IOrder); 

这就说明书写着没有考虑到记录不存在问题,所以才会那么快地随便声明double对象。如果Linq的升级版本真的有那个能力处理空数据,使用者也应该在逻辑上声明为 double? 类型才对。但是这是不是对程序要求高了?所以老实地先去判断Any()很适合现在的Linq以及用户所习惯达到的能力。

#6


不明LZ在说什么

#1


var query= db.MenuInfo.Where(p => p.PID == PID);
if(query.Any())
{
   double q = query.Max(p => p.IOrder); 
   ......
}
else
{
   ......
}

#2


即使你写T-SQL,也得写:

if exists(select * from MenuInfo where pid=@pid) 
  select max(pid) from MenuInfo 
else
  select ......

总之是要两步才可能得到结果的。

#3


不是吧,T-SQL,可以直接select max(pid) from MenuInfo  判断结果集是否为空,然后进行相应处理

按照1楼的写法,应该是执行了select * from menuinfo where pid=xx

然后再从内存结果集中去取最大值,这样效率上肯定是比较低的

#4


select max(pid) from MenuInfo 

当没有记录时,返回的不是空记录,而是字段值为NULL(数据库值)的记录,并不是空记录。

if exists(select * from MenuInfo where pid=@pid)  

这条的“效率”地多少呢?恐怕有些人一看到“select *”就发怵。"exits(select *"表达式并不查询所有记录,而是找到第一个记录就立刻返回。这是t-sql最推荐的做法,而使用“select max(fld)”然后去判断字段是否null没有多少优势,反倒逻辑容易看不清。

#5


在写t-sql存储过程时,如果逻辑是“为购买了价值最高的商品的顾客根据这个价格累计积分”,写这个存储过程就是要写

if exists(select * from ....  ) begin  --判断是否存在合格的
   declare @price decimal
   set @price=select max(价格) ......
   --为顾客可根据@price计算积分
end

本来首先判断简单一下“是否存在”是很快的,如果先去“select max(价格) ...”反而做了很多复杂的操作。


不过,这是SQL Server编程问题。我们回到Linq。如果写

double q = db.MenuInfo.Where(p => p.PID == PID).Max(p => p.IOrder); 

这就说明书写着没有考虑到记录不存在问题,所以才会那么快地随便声明double对象。如果Linq的升级版本真的有那个能力处理空数据,使用者也应该在逻辑上声明为 double? 类型才对。但是这是不是对程序要求高了?所以老实地先去判断Any()很适合现在的Linq以及用户所习惯达到的能力。

#6


不明LZ在说什么