linq (к nhibernate), где предложение о динамическом свойстве в SQL - PullRequest
2 голосов
/ 06 марта 2009

У моего объекта есть свойство, полученное из других свойств

public class MyClass
{
    public DateTime Deadline { get; set; }
    public Severity Severity 
    {
        return (DateTime.Now - Deadline < new TimeSpan(5, 0, 0, 0)) ? Severity.High : Severity.Low;
    }
}

есть ли способ изменить следующее

return repository.Query().Where(myClass => myClass.Severity == High);

чтобы предложение where оценивалось в sql, а не в коде?

Я пытался сделать что-то подобное, но безрезультатно

public class MyClass
{
    public DateTime Deadline { get; set; }
    public Func<MyClass, bool> SeverityFunc = (DateTime.Now - Deadline < new TimeSpan(5, 0, 0, 0)) ? Severity.High : Severity.Low;
    public Severity Severity 
    {
        return SeverityFunc.Invoke(this);
    }
}

return repository.Query().Where(myClass => myClass.SeverityFunc(myclass) == High);

Я предполагаю, что функция не может быть оценена как SQL. Есть ли какой-то другой способ сделать это, не заканчивая двойными вычислениями для серьезности

Любая помощь приветствуется, т.

Редактировать: Это упрощенная версия того, что я пытаюсь сделать, я ищу ответы, которые касаются теории этого, а не конкретного исправления (хотя все еще приветствуются) Я заинтересован в том, что возможно, и в лучших практиках для достижения такого рода вещей.

Andrew

Ответы [ 2 ]

2 голосов
/ 07 марта 2009

Я использовал что-то похожее на картографе. Обязательно оберните Func на Expr, например:

public Expr<Func<MyClass, bool>> SeverityFunc ...

Обернув его выражением, linq2sql сможет посмотреть полное выражение и перевести соответствующим образом. Я не использовал его как часть экземпляра класса, подобного тому, который у вас есть, поэтому я не уверен, как это повлияет на него.

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

0 голосов
/ 19 мая 2009

Одним из вариантов является библиотека динамических запросов LINQ, см. http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Другой вариант - использовать PredicateBuilder из http://www.albahari.com/nutshell/predicatebuilder.aspx

Надеюсь, это ответит на ваш вопрос, Roelof.

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