动态构建 linq to objects where expression
Dynamicaly build linq to objects where expression
专家!
遇到一个(对某些人来说可能很简单)问题。
我有一个对象:
public class DataItem {
public string Title { get; set; }
public string ID { get; set; }
public Dictionary<String, Object> Values { get; set; }
}
我需要做的是从 "Caml like" Xml 动态构建 linq .Where。在 Xml 解析中,我使用 switch 作为条件来构建 linq 谓词:
switch (Type) {
case CriteriaType.Contains:
break;
case CriteriaType.Eq:
break;
...
并使用 PredicateBuilder(来自 C# 5.0/4.0 in a Nutshell)来组合表达式,但问题是我不知道如何构建表达式谓词,例如大于或等于。
想法是具有如下功能:
public Expression<Func<DataItem, bool>> Geq<T>(String field, Object value)
其中DataItem是我们要查询的对象,T是字典项值类型,参数字段 是 DataItem.Values 字典中的键,value 是这个键的值。
但问题是:
- 由于我们正在处理对象,因此应该将它们转换为类型
.
并且由于我们不确定 DataItem.Values 集合是否有密钥
我们需要,表达式应该构建为
的 linq 等价物
p => p.Values.ContainsKey(字段) && p.Values[字段] >= 值
如果有人能帮我解决这个问题,那就太棒了。
此外,我将非常感谢一些不错的教程和带有 "easy to understand" 示例的链接。
你能像这样在查询中添加 .Where 子句吗?
// query
var query = from d in dataItems select d;
switch (expressionType) {
case CriteriaType.Contains:
query = query.Where(d => d.Values.ContainsKey(field));
break;
case CriteriaType.Eq:
query = query.Where(d => d.Values[field] >= value);
break;
此外,我不确定我是否理解您 "Since we're operating with objects they should be converted to type" 的意思,但也许您可以将 DataItem class 重新定义为通用的:
public class DataItem<T> {
public string Title { get; set; }
public string ID { get; set; }
public Dictionary<string, T> Values { get; set; }
}
@Silverlay 我认为您正在寻找的是 Dynamic LINQ。这是LINQ团队自己提供的库
您需要做的是改用字符串表达式,如本博客所示 -
http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library
专家!
遇到一个(对某些人来说可能很简单)问题。
我有一个对象:
public class DataItem {
public string Title { get; set; }
public string ID { get; set; }
public Dictionary<String, Object> Values { get; set; }
}
我需要做的是从 "Caml like" Xml 动态构建 linq .Where。在 Xml 解析中,我使用 switch 作为条件来构建 linq 谓词:
switch (Type) {
case CriteriaType.Contains:
break;
case CriteriaType.Eq:
break;
...
并使用 PredicateBuilder(来自 C# 5.0/4.0 in a Nutshell)来组合表达式,但问题是我不知道如何构建表达式谓词,例如大于或等于。 想法是具有如下功能:
public Expression<Func<DataItem, bool>> Geq<T>(String field, Object value)
其中DataItem是我们要查询的对象,T是字典项值类型,参数字段 是 DataItem.Values 字典中的键,value 是这个键的值。
但问题是:
- 由于我们正在处理对象,因此应该将它们转换为类型 .
并且由于我们不确定 DataItem.Values 集合是否有密钥 我们需要,表达式应该构建为
的 linq 等价物p => p.Values.ContainsKey(字段) && p.Values[字段] >= 值
如果有人能帮我解决这个问题,那就太棒了。
此外,我将非常感谢一些不错的教程和带有 "easy to understand" 示例的链接。
你能像这样在查询中添加 .Where 子句吗?
// query
var query = from d in dataItems select d;
switch (expressionType) {
case CriteriaType.Contains:
query = query.Where(d => d.Values.ContainsKey(field));
break;
case CriteriaType.Eq:
query = query.Where(d => d.Values[field] >= value);
break;
此外,我不确定我是否理解您 "Since we're operating with objects they should be converted to type" 的意思,但也许您可以将 DataItem class 重新定义为通用的:
public class DataItem<T> {
public string Title { get; set; }
public string ID { get; set; }
public Dictionary<string, T> Values { get; set; }
}
@Silverlay 我认为您正在寻找的是 Dynamic LINQ。这是LINQ团队自己提供的库
您需要做的是改用字符串表达式,如本博客所示 - http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library