代码之家  ›  专栏  ›  技术社区  ›  longday

nhibernate linq-在映射时使用lambda表达式代替公式属性

  •  8
  • longday  · 技术社区  · 16 年前

    nhibernate在mapping配置中的property元素上有一个名为“formula”的属性,它允许SQL的注入“计算”一个属性。我遇到的问题是直接使用SQL语法的公式。有没有方法让nhibernate.linq使用lambda表达式而不是使用Formula属性?

    我有以下几点:

    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,而不必在formula属性中使用SQL语法,这样我就可以从映射配置中删除formula属性,并编写如下查询:

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

    如何将BalanceExpression.Expression注入到Linq查询中?

    4 回复  |  直到 8 年前
        1
  •  1
  •   J. Ed    15 年前

    public int Balance { get { return Amount - Paid; } }
    


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



        4
  •  0
  •   ShawnFumo    8 年前

    NHibernate.Property.Expression

    public class Person
    {
        public virtual Guid Id { get; set; }
        public virtual string Name { get; set; }
        public virtual DateTime StartDate { get; set; }
        public virtual DateTime? EndDate { get; set; }
        public virtual Person Manager { get; set; }
    
        public static Expression<Func<Person, bool>> IsActiveExpression =
            person => person.StartDate <= DateTimeTestable.Today() && (person.EndDate == null || person.EndDate >= DateTimeTestable.Today());
    
        public static Func<Person, bool> CompiledIsActive = IsActiveExpression.Compile(); 
    
        public virtual bool IsActive { get { return CompiledIsActive(this); } }
    }
    

    session.QueryExtended<Person>().Where(p => p.IsActive)
    

    where this article