c# - 需要包含()相关实体但没有选择这样做

标签 c# linq entity-framework linq-to-entities

我不确定如何表达这个问题的标题,所以让我解释一下。 我需要从我的数据库中选择一个实体类型的大部分,使用 .Include 选择它的相关实体,但同时只选择实体标识符等于字符串数组中的 ID 之一的实体。

我的代码如下:

List<TSRCategory> electives = new List<TSRCategory>();           
foreach (var i in client.Electives.Split('&'))
{
    int id = Int32.Parse(i);
    electives.Add(db.TSRCategories.Find(id));
}

这会正确选择属于选修课 ID 列表的 TSRCategories,但不包括相关实体。我正在使用这段代码:

TSRCategories = db.TSRCategories.Include("Competencies.CompetencySkills").ToList();

但这并不仅仅选择所选的选修课。我理想中寻找的是这样的东西:

List<TSRCategory> electives = new List<TSRCategory>();           
foreach (var i in client.Electives.Split('&'))
{
    int id = Int32.Parse(i);
    electives.Add(db.TSRCategories.Find(id));
}
TSRCategories = electives.Include("Competencies.CompetencySkills").ToList();

当然,无论出于何种原因,这都无法完成(我实际上不知道该在网上搜索什么来说明为什么这不能完成!)。 Electives 是一个以 & 作为分隔符的字符串,用于将 ID 分隔到一个数组中。 TSRCategories 包含 Competencies,Competencies 包含 CompetencySkills。有没有一种方法可以在几行代码中有效地做到这一点?

最佳答案

你会发现,将关联的id一个一个地取下来,查询性能会很差。您可以通过首先投影所有需要的 ID 的列表来一次性获取它们(我在这里假定了键名 ElectiveId):

var electiveIds = client.Electives.Split('&')
                        .Select(i => Int32.Parse(i))
                        .ToArray();
var electives = db.TSRCategories
                  .Include(t => t.Competencies.Select(c => c.CompetencySkills))
                  .Where(tsr => electiveIds.Contains(tsr.ElectiveId))
                  .ToList();

但是要提到的一件事是,将您的 ids 存储在由定界符连接的单个字符串字段中违反了数据库规范化。相反,您应该创建一个新的联结表,例如ClientElectives 以规范化方式链接与客户端关联的 Electives (ClientId, ElectiveId)。这也将简化您的 EF 检索代码。

编辑

根据documentation中的例子,我应该使用 .Select 来指定预加载的深度(而不是 .SelectMany 或其他扩展方法)。

关于c# - 需要包含()相关实体但没有选择这样做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29083749/

相关文章:

c# - 使用具有不同名称的系统类?

c# - Azure DevOps 测试数据库

c# - EF Core - 唯一的、索引的、自动生成的非主键的 guid 列

mysql - 加入和联合 Entity Framework

c# - SharpRepository EF5,如何共享 dbcontext

C#:测试 Entity Framework FromSql 以确保语法正确

c# - mvc3 如何在 Razor 上读取通过连接两个表创建的列表?

linq - 不支持嵌套查询。操作 1 ='UnionAll' 操作 2 ='MultiStreamNest'

.net - 在 linq to sql 中删除记录的最简洁语法

c# - ADO .NET、 Entity Framework 和 LINQ to SQL - 我很困惑