【问题标题】:How to filter related data using Entity Framework and LINQ to SQL and LinqKit PredicateBuilder Or IdeaBlade DevForce如何使用 Entity Framework 和 LINQ to SQL 和 LinqKit PredicateBuilder 或 IdeaBlade DevForce 过滤相关数据
【发布时间】:2014-07-05 10:06:38
【问题描述】:

我正在使用 Entity Framework 6.1.0 和 LINQ to SQL

我的对象图:

市场 1...n MarketAsset 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。

提前谢谢你。

祝你好运, 马可·阿尔维斯。

【问题讨论】:

  • 说实话,我真的不知道从哪里开始。如果这不是您所期望的,我很抱歉。感谢您的评论!
  • IdeaBlade DevForce 通过我 - 这对这个问题很重要吗?看起来很少有人熟悉 DevForce。如果它不重要,您可能希望将其从标题和标签中删除。
  • @tintyethan。完毕。谢谢。

标签: c# linq entity-framework predicatebuilder devforce


【解决方案1】:

这很难看,但应该适用于您的情况。 EF 应该将其转化为相对高效的查询。

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

【讨论】:

  • 我知道我没有提到。但是有可能通过 PredicateBuilder 或 IdeaBlade DevForce 来实现吗?
【解决方案2】:

在 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();

如果您想使用 DevForce 的 PredicateBuilder,代码如下所示:

  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);

我建议在http://drc.ideablade.com/devforce-2012/bin/view/Documentation/dynamic-queries 上查看 DevForce 的文档以获取有关动态查询的更多信息。

【讨论】:

  • 谢谢@sbelini。如果我在编译时不知道实体怎么办,即我想使用 PredicateBuilder 动态构建它??
  • 注意EntityQuery.Create()方法。我在那里硬编码了 EntityType Company,但它可能是任何其他 EntityType。
猜你喜欢
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
相关资源
最近更新 更多