2010-10-29 2 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 в результате. Есть ли лучший способ получить ProductCategory.Name в результате с помощью Dynamic Expression API? Может ли кто-нибудь помочь?

ответ

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 intellisense не подбирала. Я предположил это, потому что в запросе используется Dynamic Expression API, который использует строковое значение. Любая подсказка? – Seecott

+0

@Seecott - Ты прав. VS не заберет их. Взгляните сюда: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx –

+0

Я посмотрел у него раньше. Нет ответа. Кто-нибудь знает, как или есть образец кода, чтобы получить свойства элемента? – Seecott

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"); 
} 
Смежные вопросы