sql – NHibernate linq – 在映射时使用lambda表达式代替formula属性

前端之家收集整理的这篇文章主要介绍了sql – NHibernate linq – 在映射时使用lambda表达式代替formula属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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>

我希望nhibernate使用balanceexpression.expression而不必将sql语法放在公式属性中,这样我就可以从映射配置中删除公式属性并按如下方式编写查询

来自i的session.linq()
其中i.balance> 0
选择我;

如何将balanceexpression.expression注入linq查询

解决方法

由于您已在对象上具有Amount和Paid属性,因此您只需将Balance属性定义为常规属性
public int Balance { get { return Amount - Paid; } }

如果您没有将Amount / Paid属性设置为’Lazy’,我认为这是最好,最易读和最易维护的解决方案.
如果这些属性中的任何一个是延迟加载的,您仍然可以使用此方法,只需注意它会产生副作用.
例如 – 这样的陈述

invoices.Where(i => i.Balance > 5)

会导致集合中每个Invoice的数据库访问.这可能仍然是你可以接受的,只要知道这一点..干杯的Jhonny

猜你在找的MsSQL相关文章