通过在条件

时间:2015-06-25 04:18:07

标签: c# linq dynamic-linq

DOTNETFIDDLE

我创建了一个匿名对象列表,如下所示......

List < Object > _dynamicObjectList = new List < Object > ();
for (int i = 0; i < 5; i++) {
    _dynamicObjectList.Add(new {
        ID = i, Name = "stu" + i, Address = "address234324" + i, DateField = DateTime.Now.AddDays(i)
    });
}

现在我需要创建字符串查询。我的字符串查询在下面给出..

string searchStr ="it.ID= 1 || it.ID= 2 || it.Name= "stu1" || it.Name= "stu2"";

在最后一步中,我将使用上面的字符串过滤我的列表...

var returnList= _dynamicObjectList.GetFilteredData(searchStr );

执行动态对象的方法如下所示......

public static IQueryable GetFilteredData < T > (this IEnumerable < T > source, string searchCriteria) {

    if (!string.IsNullOrEmpty(searchCriteria)) {
        IList < T > returnList = new List < T > ();
        returnList = source.AsQueryable().Where(searchCriteria).ToList();
        return returnList.AsQueryable();
    } else {
        return source.AsQueryable();
    }

}

执行期间系统提供错误

  

“对象”类型中没有属性或字段“ID”

2 个答案:

答案 0 :(得分:2)

<T>Object,因为您传递的是List<Object>,而对象上没有您要查找的属性。

如果您的_dynamicObjectList被声明为这些匿名类型的列表,则查询可以正常执行,例如,如果您将_dynamicObjectList声明为:

var _dynamicObjectList = new[] {
            new {ID = 0, Name = "stu" + 0, Address = "address234324" + 0, DateField = DateTime.Now.AddDays(0)},
            new {ID = 1, Name = "stu" + 1, Address = "address234324" + 1, DateField = DateTime.Now.AddDays(1)},
            new {ID = 2, Name = "stu" + 2, Address = "address234324" + 2, DateField = DateTime.Now.AddDays(2)},
            new {ID = 3, Name = "stu" + 3, Address = "address234324" + 3, DateField = DateTime.Now.AddDays(3)},
            new {ID = 4, Name = "stu" + 4, Address = "address234324" + 4, DateField = DateTime.Now.AddDays(4)},
        }.ToList();

更多信息:A generic list of anonymous class

我认为,如果可能的话,最好的办法是避免使用匿名类型,只需创建一个类来保存数据。

答案 1 :(得分:0)

初始化列表的一种简单方法是使用Enumerable.Range和匿名类型:

var list = Enumerable.Range(0,5).Select(i => new {
    ID = i, 
    Name = "stu" + i, 
    Address = "address234324" + i, 
    DateField = DateTime.Now.AddDays(i)
});

无论您如何初始化它,我都会看到您的GetFilteredData方法遇到两个主要问题:

  1. 您无法将匿名类型传递给通用函数。您需要将其转换为IEnumeration<object>或使用dynamic类型,这完全违背了匿名类型的目的。
  2. 您需要先将searchCriteria中的文字解析为某种排序标准列表,然后才能将其应用于您的收藏集。根据允许的语法,它可能是一个简单或不那么简单的任务。当您获得解析器时,您需要编写一个扩展.Where方法,该方法接受string作为标准。
  3. 如果为集合定义常规类型并明确过滤条件应该是什么,那么您将使您的生活更轻松。根据您的示例,他们可以使用两个简单的列表 - 一个用于ID,另一个用于Names。然后,您可以将字符串解析为这两个集合,然后使用这些集合来过滤原始列表。