【问题标题】:Non generic IQueryable Enumeration Problem非通用 IQueryable 枚举问题
【发布时间】:2010-10-11 22:26:41
【问题描述】:

使用动态 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; }

}

【问题讨论】:

    标签: c# linq dynamic iqueryable


    【解决方案1】:

    当您的查询在运行时解析时,您不能期望动态对象的类型在编译时解析。这就是动态 linq 的全部意义所在:它允许您以编译时检查为代价执行动态查询。

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

    【讨论】:

      【解决方案2】:

      如果 IEnumerable 不是通用的,那么您应该强制转换而不是使用反射。

      【讨论】:

        猜你喜欢
        • 2013-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多