我正在使用动态表达式API(System.Linq.Dynamic
)和LINQ to Entities。我的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?有人可以帮忙吗?
答案 0 :(得分:1)
处理它的最简单方法是将循环变量声明为dynamic
,因为您没有任何静态类型信息(推断的静态类型是object
,但它是一个实例一个DynamicClass
)。
foreach (dynamic item in query)
{
string ProductNumber = item.ProductNumber;
string ProductDescription = item.ProductDescription;
string Name = item.Name;
}
否则你可以手动使用反射。
// static (extension) method to read the property
public static T GetProperty<T>(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<string>("ProductNumber");
// or as a static method
string ProductDescription = GetProperty<string>(item, "ProductDescription");
string Name = item.GetProperty<string>("Name");
}
答案 1 :(得分:0)
只需使用您用于创建匿名对象的属性名称。 VS intellisense应该接受它们。
string strTemp;
foreach (var item in query)
{
strTemp = item.ProductItem;
}
您也可以指定自己的属性名称:
.Select("new(ProductNumber as Number, ProductDescription as Description, ProductCategory.Name as Name)")