2010-11-15 70 views
0

您好我想用对象的所有属性构造动态实体框架Linq查询。示例使用对象的所有属性构造动态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)); 
      } 
     } 
    } 

任何帮助将是非常有用的!谢谢!

回答

3

你可以把每一个的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(); 
} 
+0

谢谢!!我会试试这个 – ganeshran 2010-11-15 12:38:21

+0

嗨houlgap ,你的方法完美地工作。真棒!!谢谢你! – ganeshran 2010-11-15 14:31:39

0

有一个小的动态Linq库进行文本评估。 http://www.hanselman.com/blog/TheWeeklySourceCode48DynamicQueryableMakesCustomLINQExpressionsEasier.aspx

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

简单地把这个类做的文字评价,并将其转换成一个LINQ表达式树,大多数LINQ提供像实体框架可以处理。

+0

谢谢!我会检查这个 – ganeshran 2010-11-15 10:25:23

+0

嗨我试过这个。问题是我的动态查询直接不在实体上。它是IQueryable实体的IEnumerable属性。我尝试将整个字符串传递给IQueryable,但它不解析字符串中的lambda表达式。对于例如_allABCs.Where(“temp =>(temp.ABCMyEntitys.All(MyEntity => MyEntity.MyEntity。”+ _ name +“==”+ _value)“);但它没有工作 – ganeshran 2010-11-15 12:36:35