【问题标题】:Generic parameter in NHibernate Linq queryNHibernate Linq 查询中的通用参数
【发布时间】:2013-04-09 15:45:11
【问题描述】:

有什么方法可以比较 linq 查询中的泛型类型以使用 NHibernate 转换为 SQL?

类似这样的:

public abstract class DataProviderBase<TDAO, TId>
{
    protected ISession Session;

    public virtual TDAO GetById(TId id)
    {
        var allItems = GetAllQuery();  // gives me query, usually Session.Query<TDAO>();
        var res = allItems.SingleOrDefault(item => item.Id == id);
            // !!! Operator '==' cannot be applied to operands of type 'TId' and 'TId'
        return res;
    }

    protected virtual IQueryable<TDAO> GetAllQuery()
    {
        var query = Session.Query<TDAO>();
        return query;
    }
}

我知道我可以使用Session.Get&lt;TDAO&gt;(id);,但这不是我想要的。 GetAllQuery() 是一个虚拟方法,我希望能够覆盖它。

  • NHibernate 版本:3.3.3.4000
  • NHibernate.Linq 版本:1.0

谢谢

【问题讨论】:

  • 你试过item.Id.Equals(id)吗?
  • 是的,我有,它抛出:System.NotSupportedException : Boolean Equals(System.Object)
  • @MartinVolek 这可能是问题的一部分,但 NHibernate.Linq 将与 NH 2.1.2 一起使用; NH 3+ 有一个集成的 Linq 提供程序。确保你没有使用旧包。
  • @Diego Mijelshon 我不知道。我已经删除了 Nhibernate.Linq 程序集,但它并没有像我预期的那样有帮助。我以前没有使用过它。但很高兴知道,谢谢。

标签: .net linq nhibernate generics linq-to-nhibernate


【解决方案1】:

您可以动态地创建谓词。例如:

var parameter = Expression.Parameter(typeof (TDAO));
var predicate = Expression.Lambda<Func<TDAO, bool>>(
    Expression.Equal(Expression.Property(parameter, "Id"),
                     Expression.Constant(id)),
    parameter);
var res = allItems.SingleOrDefault(predicate);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多