2010-10-29 40 views
2

我使用动态表达式API(System.Linq.Dynamic)和LINQ to Entities。我的LINQ查询如下。使用动态表达式API选择匿名类型

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

只需使用您用来创建匿名对象的属性名称即可。 VS intellisense应该选择它们。

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

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

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

问题是VS智能感知没有拿起它。我假定它是因为查询使用的是使用字符串值的动态表达式API。任何线索? – Seecott 2010-10-29 17:22:05

+0

@Seecott - 你说得对。 VS不会接他们。看看这里:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx – 2010-10-29 20:24:08

+0

我看过在它之前。没有答案。有谁知道如何或有一个示例代码来获取项目属性? – Seecott 2010-10-29 20:39:10

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"); 
}