gpt4 book ai didi

sql - NHibernate linq - 在映射上使用 lambda 表达式代替公式属性

转载 作者:行者123 更新时间:2023-12-04 08:50:34 25 4
gpt4 key购买 nike

NHibernate 在映射配置中的 property 元素上有一个名为“formula”的属性,它允许注入(inject) 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 语法放在公式属性中,这样我就可以从映射配置中删除公式属性并编写如下查询:

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

如何将 balanceexpression.expression 注入(inject) linq 查询?

最佳答案

由于您的对象已经有了 Amount 和 Paid 属性,您可以将 Balance 属性定义为常规属性:

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

如果您不将 Amount/Paid 属性设置为“Lazy”,我认为这是最好的、最易读和最可维护的解决方案。
如果这些属性中的任何一个是延迟加载的,您仍然可以使用此方法,只需注意它会产生副作用。
例如 - 这样的陈述
invoices.Where(i => i.Balance > 5)

将导致集合中每个 Invoice 的数据库访问。
这对您来说可能仍然可以接受,请注意这一点..
干杯
强尼

关于sql - NHibernate linq - 在映射上使用 lambda 表达式代替公式属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2233341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com