LINQ2SQL: передача предиката в .Count (Func <T>, bool) в подзапросе - PullRequest
2 голосов
/ 22 декабря 2010

У меня есть вопрос о предикатах в linq2sql. Что я пытаюсь сделать, это разделить условия на статический класс, а затем использовать их в моих запросах. я создал статический класс с некоторыми функциями:

public static class CountingFilters
    {
        public static  Func<CountingItem, bool> TotalItemsPredicate
            = ci =>
                      !ci.Deleted && ci.OdinProduct != null &&
                      ((ci.OdinProduct.NotOriginal == null && !ci.OdinProduct.Deleted)
                       || ((ci.OdinProduct.NotOriginal == ci.OdinProduct.GUID) && ci.OdinProduct.Deleted))
                      && (!ci.OdinProduct.Temp);

        public static  Func<CountingItem, bool> AlreadyCountedPredicate
            = ci =>
                TotalItemsPredicate(ci) && ci.CountedAmount.HasValue;
     }

Если я использую это так:

var count = CountingFacade.GetCountingItems().Count(CountingFilters.TotalItemsPredicate);

Все работает правильно, и я получаю результат. Но когда я пытаюсь создать проекции для привязки к gridview, вот так:

var result = from f in countinglist
   let alreadyCounted = f.CountingItems.Count(CountingFilters.AlreadyCountedPredicate)
   let total = f.CountingItems.Count(CountingFilters.TotalItemsPredicate)
   select new CountingProjection
   {
          AlreadyCountedProducts = alreadyCounted,
          Description = f.Description,
          NumberOfProducts = total,
          PlannedDate = f.PlannedDate.Value,
          Site = f.Site,
          Status = f.Status,
          Type = f.Type,
          GUID = f.GUID,

   };

Выдает исключение «Неподдерживаемая перегрузка, используемая для оператора запроса« Подсчет ».» По какой-то причине мои предикаты не переводятся в SQL, насколько я понимаю ... Кто-нибудь может сказать мне, что я делаю не так? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 22 декабря 2010

Другой способ - использовать методы Extension.Это сэкономит вам много времени, если вы не будете копаться в Expression и т. Д. Ваш код будет выглядеть следующим образом:

public static class CountingFilters
{
     public static int TotalItems(this IEnumerable<CountingItem> source)
     {
         return source.Count(ci => !ci.Deleted && ci.OdinProduct != null &&
                          ((ci.OdinProduct.NotOriginal == null && !ci.OdinProduct.Deleted)
                           || ((ci.OdinProduct.NotOriginal == ci.OdinProduct.GUID) && ci.OdinProduct.Deleted))
                          && (!ci.OdinProduct.Temp));
     }

     public static int AlreadyCounted(this IEnumerable<CountingItem> source)
     {
         return source.Count(ci => !ci.Deleted && ci.OdinProduct != null &&
                          ((ci.OdinProduct.NotOriginal == null && !ci.OdinProduct.Deleted)
                           || ((ci.OdinProduct.NotOriginal == ci.OdinProduct.GUID) && ci.OdinProduct.Deleted))
                          && (!ci.OdinProduct.Temp) && ci.CountedAmount.HasValue);
     }
}

    var result = from f in countinglist
       let alreadyCounted = f.CountingItems.AlreadyCounted()
       let total = f.CountingItems.TotalItems()
       select new CountingProjection
       {
              AlreadyCountedProducts = alreadyCounted,
              Description = f.Description,
              NumberOfProducts = total,
              PlannedDate = f.PlannedDate.Value,
              Site = f.Site,
              Status = f.Status,
              Type = f.Type,
              GUID = f.GUID,

       };
1 голос
/ 22 декабря 2010

Обычно вам нужно вернуть выражение >, чтобы они были переведены в SQL.

Взгляните на построитель предикатов

и это стоит посмотреть

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