смешивание функций c # с условиями Linq-To-SQL - PullRequest
1 голос
/ 02 апреля 2012

У меня проблемы со смешиванием функций c # с условиями в Linq-To-SQL

предположим, у меня есть таблица "вещи" в базе данных и локальная функция c #: bool isGood (thing, params)

Я хочу использовать эту функцию для выбора строк из таблицы.

var bad = dataContext.Things.Where(t=>t.type=mytype && !isGood(t,myparams))
dataContect.Things.deleteAllOnSubmit(bad);

или

if (dataContext.Things.Any(t=>t.type=mytype && isGood(t,myparams)))
{
    return false;
}

Конечно, это не работает, Linq не может перевести мою функцию воператор SQL.Таким образом, это приведет к:

NotSupportedException: метод 'Boolean isGood (thing, params)' не имеет поддерживаемого перевода в SQL.

Каков наилучший способ изменить его, чтобы он работал?

Я могу разделить операторы и преобразовать их в список следующим образом:

List<Things> mythings dataContext.Things.Where(t=>t.type=mytype).toList()
if (mythings.Any(t=>isGood(t,myparams)))
{
    return false;
}

это работает, но кажется неэффективным, поскольку весь список должен генерироваться в каждом случае.И я не думаю, что могу сделать deleteAllOnSubmit с результатом

Я мог бы сделать foreach по мифам вместо вызова toList (), что также работает.Хотя это выглядит не элегантно.

Какие еще варианты у меня есть, и какой подход рекомендуется использовать здесь?

edit:

с вызовом asEnumerable ()кажется, другой вариант, и, кажется, лучше, чем toList () по крайней мере.Т.е.

dataContext.Things.Where(t=>t.type=mytype).asEnumerable().Any(t=>isGood(t,myparams))

1 Ответ

2 голосов
/ 02 апреля 2012

Извлечение всего списка обратно из базы данных для запуска локальной функции c # может показаться неэффективным, но это то, что вам нужно сделать, если ваша функция isGood () является локальной.

Если вы можете перевести свою функцию isGood () в Linq, вы можете применить ее перед вызовом toList (), чтобы она была переведена в SQL и весь список не был получен.

...