【问题标题】:Expression Trees in NHibernateNHibernate 中的表达式树
【发布时间】:2017-04-06 08:41:01
【问题描述】:

我有一个有这个签名的方法

public static IList<T> GetBy<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression)

我通过从表达式树中检索数据来传递 lambda 表达式并在 nhibernate 中进行搜索限制。

所以当类用户传递类似的东西时:

c => c.fullName == "John" && c.lastName == "Smith" && c.lastName != "" || c.fullName != ""  && c.Age > 18

我可以从表达式树中读取这个结构,这样我就有了一个完整的智能方式来提供搜索条件

换句话说:我需要将搜索条件传递给数据访问层(Nhibernate)

所以我需要从表达式树中提取标准,然后通过示例将其传递给 n hibernate:

c=>c.fullname = "John" 

我将从表达式树中提取以下信息:

propertyname = fullname , value = "John" , restrictiontype = "equality" 

然后将此信息传递给休眠,如下所示:

ICriteria crit = session.CreateCriteria(typeof(T));
                    crit.Add(Restrictions.Eq(propretyName, value));
    IList<T> list = crit.Add(List<T>())
                    return list;

问题是从表达式树中读取真的很困难,所以我想知道你们是否有任何简单的方法可以在表达式树中迭代以提取数据,或者你们有一些代码来从表达式树中检索数据。

【问题讨论】:

  • 我已经编辑了提供更多信息的问题,抱歉

标签: c# linq nhibernate expression-trees


【解决方案1】:

这是一些检索您提到的信息的代码。我相信您可以扩展它以包含您可能正在寻找的其他信息。

public class Criterion
{
    public string PropertyName;
    public object Value;
    public ExpressionType RestrictionType;
}

[....]

public static IEnumerable<Criterion> GetCriteria<T>(Expression<Func<T, bool>> expression)
{
    return getCriteria<T>(expression.Body);
}
private static IEnumerable<Criterion> getCriteria<T>(Expression expression)
{
    if (expression is BinaryExpression)
    {
        var bin = (BinaryExpression) expression;
        if (bin.NodeType == ExpressionType.And || bin.NodeType == ExpressionType.AndAlso ||
            bin.NodeType == ExpressionType.Or || bin.NodeType == ExpressionType.OrElse)
            return getCriteria<T>(bin.Left).Concat(getCriteria<T>(bin.Right));

        if (bin.Left is MemberExpression)
        {
            var me = (MemberExpression) bin.Left;
            if (!(bin.Right is ConstantExpression))
                throw new InvalidOperationException("Constant expected in criterion: " + bin.ToString());
            return new[] { new Criterion {
                PropertyName = me.Member.Name,
                Value = ((ConstantExpression) bin.Right).Value,
                RestrictionType = bin.NodeType
            } };
        }

        throw new InvalidOperationException("Unsupported binary operator: " + bin.NodeType);
    }

    throw new InvalidOperationException("Unsupported expression type: " + expression.GetType().Name);
}

【讨论】:

  • 非常好的伙伴,我做了一个类似的方法,但它总是给我例外,谢谢 Timwi
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多