linq(to nhibernate)where子句在sql中的动态属性

时间:2009-03-06 12:02:36

标签: linq nhibernate

我的实体有一个从其他属性派生的属性

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。是否有其他方法可以做到这一点而不会导致重复计算严重性

任何帮助表示赞赏,ta

编辑:这是我试图做的简化版本,我正在寻找涵盖理论而非特定修复的答案(尽管仍然受欢迎)。我对可能的事情以及实现这类事情的最佳实践感兴趣。

安德鲁

2 个答案:

答案 0 :(得分:2)

我在mapper上使用了类似的东西。确保在Expr上打开Func,如:

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

通过使用expr包装它linq2sql将能够查看完整的表达式并适当地翻译。我没有将它作为你所拥有的类实例的一部分使用,所以我不确定它会如何影响它。

关于在哪里放置它,我不得不继续我最后一次处理类似的场景,在我的情况下它最终在mapper中,但主要是因为它更像是一个非常糟糕的数据库模式的映射问题而不是域逻辑。我甚至没有在域实体上动态计算该属性(当然是另一种情况)。

答案 1 :(得分:0)

一个选项是LINQ动态查询库,请参阅http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

另一种选择是使用http://www.albahari.com/nutshell/predicatebuilder.aspx

中的PredicateBuilder

希望这能回答你的问题, 鲁洛夫。