使用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)")