【问题标题】:NHibernate.Linq - Custom/Calculated property expressionNHibernate.Linq - 自定义/计算属性表达式
【发布时间】:2010-02-09 14:26:27
【问题描述】:

域对象如何包含从其他数据库映射属性计算值的属性,以便计算的属性可以在域对象实例和 nhibernate.linq 的数据库级别中使用。

我希望能够在直接使用对象时使用该属性:

Console.WriteLine(Entity.Calculated.ToString());

当使用 nhibernate.linq 时

var q = from e in session.Linq<Entity>()
                where e.Calculated > 0
                select e;

【问题讨论】:

  • 你试过了吗?如果是,你得到了什么错误,你使用了什么映射?如果没有,您是否只是在寻找指向文档的指针?
  • 我没有尝试这个,因为我知道 nhibernate 会给我一个未映射的属性错误,因为我当前没有映射 Entity.Calculated。我正在寻找指针和/或文档。

标签: sql linq nhibernate


【解决方案1】:

您需要复制类和映射中的逻辑。这是一个例子:

类:

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 Amount - 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>

现在您可以使用 Linq 并在 Invoice.Balance 上查询

【讨论】:

  • 完美!你知道是否有办法使用 linq 表达式来注入公式?表达式> exp = i => i.Amount - i.Paid;
  • 注入哪里?请记住,公式中的“金额 - 已支付”指的是字段,而不是属性。
  • 我想写一个 lambda 1 次并通过调用 return expression.compile().invoke(invoice); 让属性使用该表达式;并且还让 nhibernate 使用表达式代替基于 sql 语法的公式。这样我只写了1次算法。我想我已经把自己引向了一个新问题。确定如何提问后,我会发布新问题的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多