如何使用Any()而不是foreach?

时间:2011-08-08 14:17:08

标签: c# sql-server linq-to-sql

我需要使用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))
             {

虽然它现在有效,但我真的很想了解我所缺少的东西。

3 个答案:

答案 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返回的代码似乎正在执行一个编译好的转换,但是在运行时会爆炸,因为应该转换的对象有错误的类型。

返回数据时Anyforeach只会爆炸的原因很简单:没有数据,就不会执行强制转换。