Как фильтровать связанные данные, используя 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 для получения дополнительной информации о динамических запросах.