【问题标题】:Constructing Dynamic LINQ queries with all properties of an object使用对象的所有属性构造动态 LINQ 查询
【发布时间】:2010-11-15 09:43:01
【问题描述】:

您好,我想使用对象的所有属性构造一个动态 Entity Framework Linq 查询。示例

我想:- 1) 对象测试有 5 个公共属性。 2)我想遍历这个对象并检查每个字符串属性是空还是空。 3)如果没有,我想编写一个查询,该查询将附加一个 where 条件来搜索具有此属性值的实体。

    public void CheckMyEntity(IQueryable<ABCEty> _allABCs, MyEntity _MyEntityProperty)
    {
        foreach (var prop in _MyEntityProperty.GetType().GetProperties())
        {
            if (!String.IsNullOrEmpty(prop.GetValue(_MyEntityProperty,null).ToString()))
            {
                _allABCs = _allABCs.Where(temp => (temp.ABCMyEntitys.All(MyEntity => MyEntity.MyEntity.<<I cant insert the property here>> == prop.GetValue(_MyEntityProperty,null));
            }
        }
    }

任何帮助都会非常有用!谢谢!

【问题讨论】:

    标签: c# .net linq reflection linq-to-entities


    【解决方案1】:

    您可以将每个 PropertyInfo 转换为 lambda 表达式并将其传递给查询

    public static void CheckMyEntity(IQueryable<ABCEty> _allABCs, MyEntity _myEntity)
    {
        foreach (var propertyInfo in _myEntity.GetType().GetProperties())
        {
            if (!String.IsNullOrEmpty(propertyInfo.GetValue(_myEntity, null).ToString()))
            {
                //access to modified closure
                PropertyInfo info = propertyInfo;
                _allABCs = _allABCs.Where(temp => temp.ABCMyEntitys.All(GenerateLambda(_myEntity, info)));
            }
        }
        var result = _allABCs.ToList();
    }
    
    private static Func<MyEntity, bool> GenerateLambda(MyEntity _myEntity, PropertyInfo propertyInfo)
    {
        var instance = Expression.Parameter(propertyInfo.DeclaringType, "i");
        var property = Expression.Property(instance, propertyInfo);
        var propertyValue = Expression.Constant(propertyInfo.GetValue(_myEntity, null));
        var equalityCheck = Expression.Equal(property, propertyValue);
        return Expression.Lambda<Func<MyEntity, bool>>(equalityCheck, instance).Compile();
    }
    

    【讨论】:

    • 嗨 houlgap,您的方法非常有效。惊人的!!非常感谢!
    【解决方案2】:

    有一个小型 Dynamic Linq 库可以进行文本评估。 http://www.hanselman.com/blog/TheWeeklySourceCode48DynamicQueryableMakesCustomLINQExpressionsEasier.aspx

    Dim query = Northwind.Products
                .Where("CategoryID=2 And p.UnitPrice>3")
                .OrderBy("SupplierID")
    

    简单地说,这个类对文本进行评估,并将其转换为大多数 LinQ 提供程序(如 Entity Framework)都可以处理的 Linq 表达式树。

    【讨论】:

    • 嗨,我试过了。问题是我的动态查询直接不在实体上。它是 IQueryable 实体的 IEnumerable 属性。我尝试将整个字符串传递给 IQueryable,但它不解析字符串中的 lambda。例如_allABCs.Where("temp => (temp.ABCMyEntitys.All(MyEntity => MyEntity.MyEntity."+_name+"== "+_value)"); 但它没有用
    猜你喜欢
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多