Вызов функций в Linq To SQl .net 3.5 - PullRequest
5 голосов
/ 23 ноября 2010

ребята Как мне добиться следующего

var productslist=from p in productsTable
                 select new product{Id=p.Id,Tax=myfunctions.calculateTax(p.price)};

Я попытался Google и наткнулся на этот документ .Есть ли другой способ, которым я могу сделать это без использования сторонних dll

Решение: переместите приложение в .net 4.0 (это фактически поддержка и должна работать)Но пока я придерживался нижеприведенного решения

Ответы [ 2 ]

11 голосов
/ 23 ноября 2010

LINQ to SQL не может магически перевести произвольно C # в TSQL; ограниченный выбор обычно необходимого синтаксиса доступен внутри LINQ, но метод C # не будет работать.

Параметры:

  • переписать функцию как UDF (в TSQL) и отобразить UDF в свой контекст данных (т.е. перетащить UDF на поверхность конструктора); используйте myDataContext.MyUdf(args) в LINQ
  • примените вашу функцию только после того, как данные вернутся в .NET-land
  • переписать функцию в виде LINQ-проекции

Я полагаю, что средний вариант самый простой в вашем сценарии. Например:

var productslist=
            (from p in productsTable
             select new {Id=p.Id,p.price}).AsEnumerable()
            .Select(p => new {p.Id, Tax=myfunctions.calculateTax(p.price)});

AsEnumerable() нарушает «композицию» - т. Е. Останавливает LINQ-to-SQL от попыток понять calculateTax с точки зрения TSQL; только Id и price извлекаются из SQL; затем при обработке каждой строки применяет второй прогноз для расчета налога.

6 голосов
/ 23 ноября 2010

Вы пытаетесь вызвать локальную функцию или функцию в базе данных? Если это локальная функция и это последнее, что вы делаете, это просто - вам просто нужно вызвать AsEnumerable(), чтобы заставить остальную часть запроса выполнить локально:

var products = productsTable.AsEnumerable()
                            .Select(p => new Product
                                    { p.Id, Tax = CalculateTax(p.Price) });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...