Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Entity и Like - как побороть ошибку?  [new]
KononovAI
Member

Откуда:
Сообщений: 148
Здравствуйте.

Есть код:

...
     // Список участков из Entity
      var query = entDataSet
                     .ZR_TERR
                     .Select(x => new
                                       {
                                           x.ID,
                                           x.CAD_QUART,
                                           x.CAD_NUM,
                                           x.SQUARE,
                                           x.CATEGORY_ID
                                       });

// Здесь в Watch query.Count() = 150;

...   
     // Фильтр по полю CATEGORY
         query = query.Where(x => param.filters.ListCategory.Contains(x.ZR_CATEGORY_ID));  // List<int> param.filters.ListCategory - ID из справочника CATEGORY

// Здесь в Watch query.Count() = 100;

     // Фильтр по маске номера
         query = from c in query
                    where SqlMethods.Like(c.CAD_NUM, param.filters.ListCadNum[0])
                    select c;

// Здесь в Watch query.Count() уже не определяется. 
// Выдает: LINQ to Entities does not recognize the method 'Boolean Like(System.String, System.String)' method, and this method cannot be translated into a store expression.


Как это победить?


Пробовал сделать через Regex так:

delegate bool CadNumsFinder(string CadNum, List<string> Masks);

CadNumsFinder finder = delegate (string CadNum, List<string> Masks)
{
  foreach (string Msk in Masks)
  {
     Regex rx = new Regex(Msk.Replace("?", ".").Replace("*", ".*"));
     if (rx.Match(CadNum).Success)
        return true;
  };
  return false;
};

query = query.Where(x => finder(x.CAD_NUM, param.filters.ListCadNum));


В этом случае выдает:
на query.Count() - The LINQ expression node type 'Invoke' is not supported in LINQ to Entities.




Подскажите, как правильно сделать Like?

Спасибо.
24 авг 12, 10:06    [13058546]     Ответить | Цитировать Сообщить модератору
 Re: Entity и Like - как побороть ошибку?  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
         query = from c in query
                    where c.CAD_NUM.Contains(param.filters.ListCadNum[0])
                    select c;


А так?
24 авг 12, 14:03    [13059818]     Ответить | Цитировать Сообщить модератору
 Re: Entity и Like - как побороть ошибку?  [new]
KononovAI
Member

Откуда:
Сообщений: 148
Так он найдет вхождение строки в строку. По маске так не получится. Например, надо найти такое - '36:??:0101*'.

Решилось так:
http://stackoverflow.com/questions/3095781/how-to-use-sql-like-with-linq-to-entities
27 авг 12, 16:15    [13070912]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить