使用Dynamic Expression API选择匿名类型

我正在使用带有LINQ to Entities的动态表达式API( System.Linq.Dynamic )。 我的LINQ查询如下。

 var query = this.db.Products.AsQueryable() .Where(strCondition) .OrderBy("ProductNumber") .Select("new(ProductNumber, ProductDescription, ProductCategory.Name)"); 

现在我有了“查询”,我不知道如何获得每个字段的值。

 string strTemp; foreach (var item in query) { strTemp = item.? } 

它是匿名类型,所以我不能真正使用强类型来获取值。 我能做什么? 我选择获取匿名类型字段的原因是因为我需要将ProductCategory.Name字段放入结果中。 有没有更好的方法在Dynamic Expression API的结果中获取ProductCategory.Name? 有人可以帮忙吗?

处理它的最简单方法是将循环变量声明为dynamic因为您没有任何静态类型信息(推断的静态类型是object但它是DynamicClass一个实例)。

 foreach (dynamic item in query) { string ProductNumber = item.ProductNumber; string ProductDescription = item.ProductDescription; string Name = item.Name; } 

否则,您可以手动使用reflection。

 // static (extension) method to read the property public static T GetProperty(this DynamicClass self, string propertyName) { var type = self.GetType(); var propInfo = type.GetProperty(propertyName); return (T)propInfo.GetValue(self, null); } // usage: foreach (DynamicClass item in query) { // using as an extension method string ProductNumber = item.GetProperty("ProductNumber"); // or as a static method string ProductDescription = GetProperty(item, "ProductDescription"); string Name = item.GetProperty("Name"); } 

只需使用您用于创建匿名对象的属性名称。 VS intellisense应该接受它们。

 string strTemp; foreach (var item in query) { strTemp = item.ProductItem; } 

您也可以指定自己的属性名称:

 .Select("new(ProductNumber as Number, ProductDescription as Description, ProductCategory.Name as Name)")