当没有符合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
{
......
}
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 ......
总之是要两步才可能得到结果的。
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
然后再从内存结果集中去取最大值,这样效率上肯定是比较低的
按照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没有多少优势,反倒逻辑容易看不清。
当没有记录时,返回的不是空记录,而是字段值为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以及用户所习惯达到的能力。
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
{
......
}
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 ......
总之是要两步才可能得到结果的。
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
然后再从内存结果集中去取最大值,这样效率上肯定是比较低的
按照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没有多少优势,反倒逻辑容易看不清。
当没有记录时,返回的不是空记录,而是字段值为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以及用户所习惯达到的能力。
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在说什么