Как фильтровать связанные данные, используя Entity Framework и LINQ to SQL и LinqKit PredicateBuilder или IdeaBlade DevForce

Я использую Entity Framework 6.1.0 и LINQ to SQL

Мой граф объектов:

Маркет 1...n МаркетАссет n... n КомпанияМаркет n...1 Компания

Так,

Market has a Collection of MarketAsset called MarketAssets
MarketAsset has a collection of CompanyMarket called CompanyMarkets
CompanyMarket has a property name callled Company
Company has a string property called Guid. 

Мой вопрос: как мне получить список всех рынков, на которых работает Компания, учитывая, что мне нужно отфильтровать свойство Company.Guid?

PS1: я хочу вернуть только рынки. Я не хочу включать какие-либо другие связанные объекты в мой набор результатов.

PS2: я использую IdeaBlade DevForce, а также.

Заранее спасибо.

Лучшие пожелания, Марко Алвес.

2 ответа

Это некрасиво, но должно работать для вашего случая. EF должен перевести это в относительно эффективный запрос.

        db.Markets.Where(mrkt =>
            mrkt.MarketAssets.Any(ma =>
                ma.CompanyMartkets.Any(cm =>
                    cm.Company.Guid == yourFilterGuid))).ToList();

В DevForce попробуйте это

  var query = mgr.Companies.Where(comp => comp.Guid.Equals(searchGuid))
    .SelectMany(comp => comp.CompanyMarkets)
    .SelectMany(cMkt => cMkt.MarketAssets)
    .Select(mAsset => mAsset.Market);

  var results = await query.ExecuteAsync();

  results = results.Distinct();

Если вы хотите использовать PredicateBuilder от DevForce, код будет выглядеть так:

  var p1 = PredicateBuilder.Make(typeof(Company), "Guid", FilterOperator.IsEqualTo, searchGuid);
  var selector1 = new ProjectionSelector("CompanyMarkets");
  var selector2 = new ProjectionSelector("MarketAssets");
  var selector3 = new ProjectionSelector("Market");

  var rootQuery = EntityQuery.Create(typeof(Company), mgr2);

  var dynamicQuery = rootQuery
    .Where(p1)
    .SelectMany(selector1)
    .SelectMany(selector2)
    .Select(selector3);

Я предлагаю проверить документацию DevForce по адресу http://drc.ideablade.com/devforce-2012/bin/view/Documentation/dynamic-queries для получения дополнительной информации о динамических запросах.

Другие вопросы по тегам