Пользовательский метод в запросе LINQ to SQL - PullRequest
3 голосов
/ 03 сентября 2010

Возможно ли использовать пользовательский метод в запросе, например:

var result = from u in context.MyTable where MyMethod(u) == 10 select u;

Ответы [ 3 ]

8 голосов
/ 03 сентября 2010

Как объясняет Pranay, пользовательский метод (C #) не может быть частью запроса LINQ to SQL, поскольку LINQ to SQL не сможет просматривать дерево выражений метода и поэтому не может перевести его в SQL.

Один из вариантов, который у вас есть, - написать свою функцию на SQL и сохранить ее как функцию SQL на SQL Server (возможно, вы также можете использовать SQL CLR, но я этого не пробовал). Затем вы можете добавить функцию к вашему типу DataContext, и LINQ to SQL преобразует ее в вызовы функции на сервере SQL. Что-то вроде:

var result = from u in context.MyTable 
             where context.MyMethod(u) == 10 select u; 

Проблема, конечно, в том, что вам нужно написать функцию на SQL (я думаю, что SQL CLR также может работать - хотя и не уверен в производительности и других возможных сложностях)

Я также написал статью (некоторое время назад), в которой показано, как это сделать, когда вы пишете "метод" в виде дерева выражений (как значение типа Expression<Func<...>>), который возможно, потому что в этом случае код компилируется как дерево выражений. Однако есть некоторая постобработка, которая должна быть выполнена, и вы все равно можете написать только одно выражение, которое можно легко вставить в запрос LINQ.

3 голосов
/ 03 сентября 2010

Проверьте эту полную статью: Что есть и что не возможно с linq

Следование не возможно

// function used in filter
static bool MyFunc(Nwind.Product p)
{
  return p.ProductName.StartsWith("B");
}
// query that uses MyFunc
var q = 
  from p in db.Products
  where MyPriceFunc(p.UnitPrice) > 30m
  select p

Он компилируется без ошибок, нокогда вы выполняете его, LINQ to SQL выдает исключение, говорящее: «Статический метод System.Boolean MyTest (LINQTest.Nwind.Product) не имеет поддерживаемого перевода в SQL».

Исключение фактически выдается при попытке извлечь результаты из q (например, с помощью оператора foreach), потому что LINQ to SQL пытается преобразовать деревья выражений в T-SQL только тогда, когда нужны результаты изапрос должен быть выполнен.

Чтобы исправить пример, вы можете просто скопировать код, который проверяет, начинается ли название продукта с «B» в предложении where запроса, и он будет работать нормально.

0 голосов
/ 03 сентября 2010

Да, но если вы используете Linq-to-Sql - ваш метод должен иметь специальный код для обработки преобразования SQL.

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