lon*_*day 8 sql linq nhibernate
NHibernate在名为"formula"的映射配置中的属性元素上有一个属性,它允许注入sql来"计算"一个属性.我遇到的问题是直接使用sql语法的公式.有没有办法让nhibernate.linq使用lambda表达式而不是使用公式属性.
我有以下内容:
public class Invoice
{
public virtual int Id { get; protected set; }
public virtual decimal Amount { get; set; }
public virtual decimal Paid { get; set; }
public virtual decimal Balance
{
get { return BalanceExpression.Expression.Compile().Invoke(this); }
}
}
public class BalanceExpression
{
public static Expression<Func<Invoice, decimal>> Expression
{
get { return i => i.Amount - i.Paid; }
}
}
<class name="Invoice">
<id name="Id">
<generator class="hilo"/>
</id>
<property name="Amount"/>
<property name="Paid"/>
<property name="Balance" formula="Amount - Paid" access="readonly"/>
</class>
Run Code Online (Sandbox Code Playgroud)
我希望nhibernate使用balanceexpression.expression而不必将sql语法放在公式属性中,这样我就可以从映射配置中删除公式属性并按如下方式编写查询:
来自i的session.linq()其中i.balance> 0选择i;
如何将balanceexpression.expression注入linq查询?
由于您的对象已经具有 Amount 和 Paid 属性,因此您可以将 Balance 属性定义为常规属性:
public int Balance { get { return Amount - Paid; } }
Run Code Online (Sandbox Code Playgroud)
如果您不将 Amount / Paid 属性设置为“Lazy”,我认为这是最好的、最易读和最可维护的解决方案。
如果这些属性中的任何一个是延迟加载的,您仍然可以使用此方法,只是请注意它会产生副作用。例如-这样的声明
invoices.Where(i => i.Balance > 5)
Run Code Online (Sandbox Code Playgroud)
将导致对集合中的每个发票进行数据库访问。
这对你来说可能仍然可以接受,只是要注意这一点..
干杯乔尼