我需要使用LINQ在SQL Server上运行存储过程,并在返回任何行时抛出异常。以下代码有效,但foreach
循环不能很好地传达我的意图:
foreach (var badData in context.BadDataForDay(today))
{
throw new Exception("Bad data found");
}
我想在SQL中编写类似IF EXISTS()
的内容,但使用LINQ:
var badData = from p in context.BadDataForDay(today) select p;
if (badData.Any())
{
throw new Exception("Bad data found");
}
此代码会编译但Any()
会出现以下消息:
指定的演员表无效
我错过了什么? Any()
在这种情况下使用正确的方法吗?
修改 我调试了,代码在调用存储过程之前爆炸,在下面生成的行:
return ((ISingleResult<BadDataResult>)(result.ReturnValue));
为了让它发挥作用,我做了以下事情:
我添加了另一个存储过程并将其拖到我的上下文中:
CREATE PROCEDURE dbo.BadDataExists
@AsOfDate DATETIME
AS
BEGIN ;
SET NOCOUNT ON ;
SELECT COUNT(*) AS Cnt
FROM SomeTable
WHERE SOME conditions ;
END ;
我使用了这段代码:
foreach (var badDataCount in
context.BadDataExists(asOfDate).Where(badDataCount => badDataCount.Cnt > 0))
{
虽然它现在有效,但我真的很想了解我所缺少的东西。
答案 0 :(得分:1)
这应该有效:
var badData = context.BadDataForDay(today);
if (badData != null && badData.Any())
{
throw new Exception("Bad data found");
}
抛出什么异常?
答案 1 :(得分:1)
任何用于这种情况的例子(我不确定这是你需要的):
var res = (from c in context.Cusotmer
where c => c.Orders.Any(o => o.year == 2010)
select c);
在您的情况下,可能是:
var badData = (from p in context.BadDataForDay
where p => p.Days.Any(d => d == today) select p);
答案 2 :(得分:1)
如果foreach
会返回任何数据,我认为您的context.BadDataForDay(today)
代码也会爆炸......
将对象从数据库转换为C#对象并将它们作为可枚举的内部BadDataForDay
返回的代码似乎正在执行一个编译好的转换,但是在运行时会爆炸,因为应该转换的对象有错误的类型。
返回数据时Any
和foreach
只会爆炸的原因很简单:没有数据,就不会执行强制转换。