У меня есть таблица базы данных с номерами учетных записей. Внутри той же таблицы находятся тестовые учетные записи, которые не соответствуют форматированию продукции: например, "A1111" - это производство, но "JTest" - нет. У меня есть Regex, который вытащит только мои производственные счета. Мне нужен конкретный скомпилированный запрос, чтобы вытащить только производственные учетные записи. Запрос дает мне количество клиентов по регионам и дате; и подсчет понятий в каждом регионе:
getCustomerDistribution = CompiledQuery.Compile<DataContext, String, DateTime, IEnumerable<ServerLoad>>(
(context, region, processDate) => (from cust in context.GetTable<tbl_CustomerDistro>()
where cust.ProcessedDate.Date == processDate.Date
where cust.Region == region
where Regex.IsMatch(cust.AcctNum, ProductionMask)
group cust by new
{
cust.Region,
cust.Concept
} into custDistro
orderby custDistro.Key.Region
select new CustomerDistro
(
custDistro.Key.Region,
custDistro.Key.Concept,
custDistro
.Where(c => c.Concept == custDistro.Key.Concept)
.Select(c => c.Concept).Count()
)));
Проблема в том, что во время выполнения я получаю следующее сообщение:
Метод 'Boolean IsMatch (System.String, System.String) 'не поддерживается перевод на SQL.
Я смотрел на определенную пользователем функцию:
static Func<striing, bool> IsProduction = (AcctNum) => Regex.IsMatch(AcctNum, ProductionMask);
Это тоже не работает. Я не хочу перебирать записи, которые извлекаются для дальнейшего фильтрации, если только нет другого способа сделать это.
Есть ли способ сделать это с помощью Predicate Builder?
Обновление:
Другой вариант, который, я думаю, будет использовать:
where SqlMethods.Like (cust.AcctNum, ProductionMask)
Однако моя ProductionMask написана для Regex:
^[B,G]\d{4}$
Есть ли способ сделать это с помощью SqlMethods.Like(...)?
Обновление 2:
Это очень медленный запрос. У меня есть 3 региона, с которыми выполняется этот запрос, и количество записей и время возврата:
263: 903ms
342: 822ms
146: 711 мс