Создание методов, которые действительно переводят в SQL? - PullRequest
4 голосов
/ 25 сентября 2010

В базе данных приложения, которое я использую, есть запись с полем «Дата». В многих местах в коде мы должны преобразовать это в финансовый год для группировки, выбора и фильтрации. Вот несколько примеров того, как может выглядеть запрос:

var query = from r in DB.records
            let fy = r.Date.Month >= 10 ? r.Year + 1 : r.Year
            where fy = 2010
            select r;

Теперь я знаю, что мог бы написать метод Expression для использования того же фильтра , но что, если я хочу использовать его для выбора и группировки? Я не хочу писать вторую строку снова и снова во всех запросах. Было бы неплохо просто иметь возможность сделать:

var query = from r in DB.records
            let fy = r.Date.GetFY()
            where fy = 2010
            group r by fy into g
            select g.Count();

Таким образом, разные клиенты могут иметь разные определения финансового года и тому подобное, и все они могут быть определены в одном и том же месте. Есть какой-либо способ сделать это? Написание обычного метода GetFY просто вызывает исключение «Не могу перевести на SQL» (или как там на самом деле). Очевидно, что на каком-то уровне это можно перевести в SQL, я просто не знаю, можно ли простым способом воссоздать повторное использование LINQ to SQL.

Заранее спасибо.

1 Ответ

5 голосов
/ 25 сентября 2010

Если вы можете написать ее как функцию SQL, вы можете создать фиктивную функцию C # для использования в коде LINQ и указать LINQ сопоставить ее с вашей функцией SQL.Сопоставление выполняется с помощью атрибута.

Вам нужно сделать что-то вроде:

[Function(Name = "udf_GetFY", IsComposable = true)]
public int  getFY(DateTime t)
{
    return 5; // value doesn't matter
}

, а затем:

 var query = from r in DB.records 
        let fy = GetFY(r.Date) 
        where fy = 2010 
        group r by fy into g 
        select g.Count();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...