非通用的IQueryable枚举问题

时间:2009-03-07 14:09:13

标签: c# linq dynamic iqueryable

使用动态linq(http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx)我运行下面的查询,返回一个IQueryable。在这个也是IEnumerable的结果我能够运行Count()但是没有ToList()来获取值。我可以使用foreach枚举它们,但是无法在没有反射的情况下访问生成的匿名类型中的各个字段。这是唯一的方法吗?感谢

var query =
                db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10).
                OrderBy("CompanyName").
                Select("New(CompanyName as Name, Phone)");

            foreach (var item in query)
            {
                foreach (var prop in item.GetType().GetProperties())
                {
                    Console.WriteLine(prop);
                }
            }

尝试投射但遇到错误无法将“DynamicClass1”类型的对象强制转换为“测试”类型。

 foreach (var item in query)
            {
                Console.WriteLine("{0}: {1}", ((Test)item).CompanyName, ((Test)item).Phone);
            }

public class Test {
            public string CompanyName { get; set; }
            public string Phone { get; set; }

}

2 个答案:

答案 0 :(得分:1)

在运行时解析查询时,不能指望在编译时解析动态对象的类型。这就是动态linq的全部内容:它允许您在成本编译时检查时执行动态查询。

您必须使用反射来访问动态类型的属性,至少在C#4之前。

答案 1 :(得分:0)

如果IEnumerable不是通用的,那么你应该投射而不是使用反射。