C# 如何使用实体框架和LINQ to SQL以及LinqKit PredicateBuilder或IdeaBlade DevForce筛选相关数据
我正在使用EntityFramework6.1.0和LINQtoSQL 我的对象图: 市场1…n市场资产n…n公司市场n…1公司 所以 我的问题是:考虑到我需要过滤Company.Guid属性,如何获取公司运营的所有市场的列表 PS1:我只想返回市场。我不想在结果集中包含任何其他相关实体 PS2:我也在使用IdeaBlade DevForce 先谢谢你 最好的威士忌,C# 如何使用实体框架和LINQ to SQL以及LinqKit PredicateBuilder或IdeaBlade DevForce筛选相关数据,c#,linq,entity-framework,predicatebuilder,devforce,C#,Linq,Entity Framework,Predicatebuilder,Devforce,我正在使用EntityFramework6.1.0和LINQtoSQL 我的对象图: 市场1…n市场资产n…n公司市场n…1公司 所以 我的问题是:考虑到我需要过滤Company.Guid属性,如何获取公司运营的所有市场的列表 PS1:我只想返回市场。我不想在结果集中包含任何其他相关实体 PS2:我也在使用IdeaBlade DevForce 先谢谢你 最好的威士忌, 马可·阿尔维斯。这很难看,但应该适合你的情况。EF应该将此转换为一个相对高效的查询 db.Markets.Whe
马可·阿尔维斯。这很难看,但应该适合你的情况。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();
如果要使用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);
我建议查看位于的DevForce文档,以了解有关动态查询的更多信息。老实说,我真的不知道从哪里开始。如果这不是你所期望的,我很抱歉。谢谢你的评论!IdeaBrade DevForce通过我-这对问题很重要吗?似乎很少有人熟悉DevForce。如果它不重要,您可以将其从标题和标记中删除。@tintyethan。完成。谢谢你,我知道我没有提到。但有可能通过PredicateBuilder或iDeaBrade DevForce实现吗?谢谢你@sbelini。如果我在编译时不知道实体,例如,我想使用PredicateBuilder动态构建它,该怎么办?注意方法EntityQuery.Create()。在那里,我硬编码了EntityType公司,但它可能是任何其他EntityType。
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);