我可以在C#中动态生成linq表达式吗?

时间:2012-05-08 11:34:15

标签: c# linq lambda

我现在有一块看起来像这样的Linq;

List<dynamic> childrenToBeRemoved = this.ItemsSource.Where(o => o.ParentID == "1234").ToList();

其中ItemsSource是动态的ObservableCollection。

这很好用,但我遇到的问题是ParentID是一个可以变化的属性。例如。它可以命名为ParentPkey或ParentKey等。

我可以创建一个表达式,我可以指定我想要在比较中使用的属性吗?

我尝试过使用动态linq,但是使用动态集合无法正常工作,可以使用pocos集合。

谢谢...

4 个答案:

答案 0 :(得分:5)

为什么让实现本身变得动态?你可以简单地做一个动态调用!

IEnumerable<MyItem> result;
if (condition1)
{
    result = this.Items.Where(arg => arg.ProductId == "123");
}
else if (condition2)
{
    result = this.Items.Where(arg => arg.ProductPK == "123");
}

Func<Item, bool> predicate;
if (condition1)
{
    predicate = item => item.ProductId == "123";
}
else if (condition2)
{
    predicate = item => item.ProductPK == "123";
}
var result = this.Items.Where(predicate);

Sooo ......我相信你应该告诉我们更多关于你实际问题的信息 - 我认为当前没有需要实施......所以,我相信你的要求是不明确的!

答案 1 :(得分:5)

如果查询是动态linq还是

,则无关紧要
Expression<Func<Entity, int>> predicate = x => x.Id == myvalue;
from entity in _context.Entities.Where(predicate)
select entity;

查看LinkKit @ http://www.albahari.com/nutshell/linqkit.aspx的PredicateBuilder 那里也有足够的例子

将表达式转换为相应的sql的责任在于linq提供者,因此请确保您使用的提供者支持相关方面

答案 2 :(得分:0)

将linq表达式放入函数中,并将此属性作为参数传递。

答案 3 :(得分:0)

如果您知道商品的类型,可以使用反射:

PropertyInfo parentProp = itemType.GetProperty("ParentKey or whatever");
List<dynamic> childrenToBeRemoved = this.ItemsSource.Where(o => Equals("1234", parentProp.GetValue(o, null))).ToList();