【问题标题】:Dynamic linq on Dynamic properties动态属性上的动态 linq
【发布时间】:2013-03-14 20:11:41
【问题描述】:

谁能帮我解决这个问题:

我收集了具有动态(ExpandoObject)属性的 poco 对象,该属性需要成为动态 linq 中字符串条件的一部分

例如

public class Test
{
   public int Id {get;set;}
   dynamic DynamicProperty {get;set;}
}

动态属性(ExpandoObject)有一个属性(IdName

如何使用动态 Linq 过滤测试对象的集合,(应该如何看起来像字符串 where 条件?):

IList<Test> testList;

testList.AsQueryable()
        .Where("DynamicProperty.Id == 2 or DynamicProperty.Name == "test"")

【问题讨论】:

  • 将 ExpandoObject 转换为 linq 中的字典,然后在字典上链接另一个过滤器。

标签: c# linq dynamic


【解决方案1】:

Dynamic LINQ 提供了一个小型可重用库,支持字符串谓词(和查询语言)来构建动态 LINQ 语句。

Download Link

【讨论】:

  • Dynamic Linq 库在上面的示例中不起作用,其中属性本身被声明为动态。
【解决方案2】:

在同一个 IQueryable 上链接 Wheres 以构建完整的表达式树,然后可以使用 ToList 来实现:

IList<string> testList = new List<string>() {"One", "Two", "Three", "Four", "Five"};

var filteredList = testList.AsQueryable().Where((s) => s.Length <= 4);
filteredList = filteredList.Where((s) => s[0].Equals('F'));

var results = filteredList.ToList();

【讨论】:

  • thanax 伙计们,但我的 where 条件必须是一个将在动态 where 子句中使用的字符串,例如我发布的示例
【解决方案3】:

thanx 伙计们,但我的 where 条件必须是一个字符串,它将在动态 where 子句中使用,就像我发布的示例一样。复杂属性 (DynamicProperty) 是未知类型,必须像示例中一样在过滤器中使用。我使用了 ExpandoObject,但上面的语法 (.Where("DynamicProperty.Id == 2 or DynamicProperty.Name == "test"")) 有问题。因为字符串结构必须是这样的 .Where("DynamicProperty["Id"] == 2 or DynamicProperty["Name"] == "test"")) 并且因为 Expando 具有 IDictionary&lt;string, object&gt; 结构,所有值都必须显式转换,最终过滤器是:.Where(Convert.ToInt32("DynamicProperty["Id"]) == 2 or DynamicProperty["Name"].ToString() == "test"")),这比第一个更复杂。

如何解决上面例子中的字符串过滤问题

"DynamicProperty.Id == 2 or DynamicProperty.Name == "test""

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 2016-11-13
    • 2021-10-11
    • 2011-02-04
    • 1970-01-01
    相关资源
    最近更新 更多