Как использовать Any () вместо foreach? - PullRequest
0 голосов
/ 08 августа 2011

Мне нужно запустить хранимую процедуру на SQL Server, используя LINQ, и выдать исключение, если он возвращает какие-либо строки. Следующий код работает, хотя цикл foreach недостаточно хорошо передает мои намерения:

foreach (var badData in context.BadDataForDay(today))
{
    throw new Exception("Bad data found");
}

Я хотел написать что-то вроде IF EXISTS() в SQL, но с LINQ:

var badData = from p in context.BadDataForDay(today) select p;
if (badData.Any())
{
    throw new Exception("Bad data found");
}

Этот код компилируется, но Any() всплывает со следующим сообщением:

Указанный состав недействителен

Чего мне не хватает? * Any() правильный метод для использования в этом случае?

Edit: Я отладил, и код взрывается до вызова хранимой процедуры в следующей сгенерированной строке:

        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 ]

1 голос
/ 08 августа 2011

Любой используется, например, с таким условием (я не уверен, что это то, что вам нужно):

  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);
1 голос
/ 15 августа 2011

Я предполагаю, что ваш foreach код также взорвется, если context.BadDataForDay(today) вернет какие-либо данные ...

Код, который переводит объекты из базы данных в объекты C # и возвращает их как перечисляемыйвнутри BadDataForDay, кажется, выполняется приведение, которое хорошо компилируется, но взрывается во время выполнения, потому что объект, который должен быть приведен, имеет неправильный тип.

Причина, по которой Any и foreach только ударпри возврате данных просто: без данных приведение не будет выполнено.

1 голос
/ 08 августа 2011

Это должно работать:

var badData = context.BadDataForDay(today);
if (badData != null && badData.Any())
{
    throw new Exception("Bad data found");
}

Какое исключение бросает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...