使用Dynamic Expression API选择匿名类型

时间:2010-10-29 09:06:46

标签: c# dynamic linq-to-entities expression

我正在使用动态表达式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?有人可以帮忙吗?

2 个答案:

答案 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)")