2015-09-02 3 views
1

Я использую расширение .AsExpandable() LinqKIT для динамического генерации выражения Where.Как включить дочерние объекты (навигация) при использовании .AsExpandable() LinqKIT

Например,

Expression<Func<Asset, bool>> assetNamePredicate = m => m.AssetName == "abc"; 
Expression<Func<Asset, bool>> assetPurchaseDateFromPredicate = m => m.PurchaseDate > DateTime.Now.AddDays(-10); 
Expression<Func<Asset, bool>> whereExpression = t => assetNamePredicate.Invoke(t) && assetPurchaseDateFromPredicate.Invoke(t); 

return new entitiesContainer().Set<Asset>().AsExpandable().Where(whereExpression).ToList<Asset>(); 

Теперь сущность активов содержит AssetTypeID, который, имеющий внешний ключ для поля идентификатора AssetType таблицы. Но когда я пытаюсь написать оператор Include для включения AssetType в набор результатов, он не работает, и свойство AssetType для каждого объекта Asset равно null всегда ... однако то же самое работает отлично, если я не использую .AsExpandable().

Любая идея о том, как мы можем использовать расширение AsExpandable() для набора результатов для загрузки связанных объектов.

P.S. - мой сценарий немного сложнее, чем пример кода, который я предоставляю, поэтому я не могу избежать этого расширения.

ответ

0

Я нашел решение этой проблемы - В основном, это требует, чтобы создать массив «Включать» выражения и запрос к ним -

Например,

List<Expression<Func<Asset, object>>> includes = new List<Expression<Func<Asset, object>>>(); 
    includes.Add(m => m.City); 
    includes.Add(m => m.City.Country); 

     return includes 
      .Aggregate(query.AsQueryable(), (current, include) => current.Include(include)) 
      .AsExpandable() 
      .Where(whereExpression) 
      .ToList<Address>(); 
0

По-видимому, известная проблема заключается в том, что метод расширения ASExpandable возвращает другой тип возвращаемого значения, поэтому разбирая бит включения Entity Framework. Для этого есть обход: прогнозы. Если вы определяете оператор Select, в котором вы переходите к своим свойствам навигации, вы можете включить их в свой результирующий набор.

Смежные вопросы