基于实体框架中某些过滤器的多个实体的动态联接

本文关键字:实体 过滤器 动态 于实体 框架 | 更新日期: 2023-09-27 17:58:25

我对实体框架和LINQ很陌生,我有一个实体,它有10多个其他相关实体(一对多关系)。现在,我计划在我的应用程序中创建一个搜索页面,用户可以在其中选择搜索时要考虑的字段(即10多个表)。

现在,我正试图编写一个查询来实现上述目标。如何使用LINQ方法语法来解决这个问题,有什么帮助吗?我的意思是,根据用户的选择编写一个多联接查询。(即Class1、Class2、…中的哪一个与主实体连接,以最终将所有相关字段放在一个位置)。下面是一个示例代码(事实上只是一种预感)

if(somefilter#1)
result = db.Companies.Join(db.Channels, p => p.Id, k => k.CId,
                                       (p, k) => new {Company = p, Channels=k});
if(somefilter#2)
result = result.Join(db.BusinnessType, ........);
if(somefilter#3)
result = result.Join(db.Values, .......);

基于实体框架中某些过滤器的多个实体的动态联接

对于复杂的查询,使用其他LINQ表示法可能更容易。你可以加入这样的多个实体:

from myEntity in dbContext.MyEntities
join myOtherEntity in dbContext.MyOtherEntities on myEntity.Id equals myOtherEntity.MyEntityId
join oneMoreEntity in dbContext.OneMoreEntities on myEntity.Id equals oneMoreEntity.MyEntityId
select new {
    myEntity.Id,
    myEntity.Name,
    myOtherEntity.OtherProperty,
    oneMoreEntity.OneMoreProperty
}

您可以通过添加更多的联接语句来联接其他实体。您可以从查询中选择任何实体的属性。我提供的示例使用了一个动态类,但您也可以定义一个类(如MyJoinedEntity),您可以选择它。要做到这一点,你可以使用类似的东西:

...
select new MyJoinedEntity {
    Id = myEntity.Id,
    Name = myEntity.Name,
    OtherProperty = myOtherEntity.OtherProperty,
    OneMoreProperty = oneMoreEntity.OneMoreProperty
}

编辑:

如果您想要条件联接,则可以使用联接所有内容所需的所有属性来定义MyJoinedEntity。然后将联接分解为多个方法。像这样:

public IEnumerable<MyJoinedEntity> GetEntities() {
    var joinedEntities = from myEntity in dbContext.MyEntities
        join myOtherEntity in dbContext.MyOtherEntities on myEntity.Id equals myOtherEntity.MyEntityId
        join oneMoreEntity in dbContext.OneMoreEntities on myEntity.Id equals oneMoreEntity.MyEntityId
            select new MyJoinedEntity {
                Id = myEntity.Id,
                Name = myEntity.Name,
                OtherProperty = myOtherEntity.OtherProperty,
                OneMoreProperty = oneMoreEntity.OneMoreProperty
            };
    if (condition1) {
        joinedEntities = JoinWithRelated(joinedEntities);
    }
}
public IEnumerable<MyJoinedEntity> JoinWithRelated(IEnumerable<MyJoinedEntity> joinedEntities) {
    return from joinedEntity in joinedEntities
    join relatedEntity in dbContext.RelatedEntities on joinedEntity.Id equals relatedEntity.MyEntityId
        select new MyJoinedEntity(joinedEntity) {
            Comments = relatedEntity.Comments
        };
}