基于实体框架中某些过滤器的多个实体的动态联接
本文关键字:实体 过滤器 动态 于实体 框架 | 更新日期: 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
};
}