我创建了一个匿名对象列表,如下所示......
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”
答案 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
方法遇到两个主要问题:
IEnumeration<object>
或使用dynamic
类型,这完全违背了匿名类型的目的。searchCriteria
中的文字解析为某种排序标准列表,然后才能将其应用于您的收藏集。根据允许的语法,它可能是一个简单或不那么简单的任务。当您获得解析器时,您需要编写一个扩展.Where
方法,该方法接受string
作为标准。如果为集合定义常规类型并明确过滤条件应该是什么,那么您将使您的生活更轻松。根据您的示例,他们可以使用两个简单的列表 - 一个用于ID,另一个用于Names。然后,您可以将字符串解析为这两个集合,然后使用这些集合来过滤原始列表。