gpt4 book ai didi

c# - 基于 Entity Framework 中的某些过滤器的多个实体的动态连接

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:48 24 4
gpt4 key购买 nike

我是 Entity Framework 和 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
};
}

关于c# - 基于 Entity Framework 中的某些过滤器的多个实体的动态连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23075154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com