Выберите анонимный тип с API динамического выражения - PullRequest
2 голосов
/ 29 октября 2010

Я использую 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 в результате.Есть ли лучший способ получить ProductCategory.Name в результате с помощью API динамического выражения?Кто-нибудь может помочь?

Ответы [ 2 ]

1 голос
/ 26 января 2011

Самый простой способ справиться с этим - объявить переменную цикла равной 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");
}
0 голосов
/ 29 октября 2010

Просто используйте имя свойства, которое вы использовали для создания анонимного объекта. VS intellisense должен забрать их.

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

Вы также можете указать свои собственные имена свойств:

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