专家!
坚持使用一个(可能对某人来说很简单)问题。
我有一个对象:
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 dynamicaly。在Xml解析时,我使用switch来条件来构建linq谓词:
switch (Type) {
case CriteriaType.Contains:
break;
case CriteriaType.Eq:
break;
...
并使用 PredicateBuilder (来自C# 5.0/4.0 in a Nutshell)来组合表达式,但事情是我不知道如何构建表达式谓词,例如GreaterOrEqual。 想法的功能如下:
public Expression<Func<DataItem, bool>> Geq<T>(String field, Object value)
DataItem 是我们要查询的对象, T 是字典项值类型,参数字段是的关键字DataItem.Values 字典和值是此键的值。
但是这里有一个问题:
因为我们不确定DataItem.Values集合是否具有密钥 我们需要,表达式应该构建为linq等价于
p =&gt; p.Values.ContainsKey(field)&amp;&amp; p.Values [ field ]&gt; = 值
如果有人可以帮助我,那就太棒了。
另外,我会非常感谢一些很好的教程和链接“易于理解”的示例。
答案 0 :(得分:2)
你能在这样的问题中添加.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;
另外,我不确定我理解你的意思“因为我们使用对象操作它们应该转换为类型”,但也许你可以重新定义你的DataItem类是通用的:
public class DataItem<T> {
public string Title { get; set; }
public string ID { get; set; }
public Dictionary<string, T> Values { get; set; }
}
答案 1 :(得分:1)
@Silverlay我认为您正在寻找的是动态LINQ。这是LINQ团队自己提供的库。
您需要做的是使用字符串表达式,如本博客所示 - http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library