需要包含()相关实体,但没有选项可以这样做

时间:2015-03-16 17:57:43

标签: 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的一部分的TSRC类别,但不包括相关实体。我使用的是这段代码:

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();

但当然,无论出于何种原因,都无法做到这一点(我实际上并不知道在网上搜索什么,为什么不能这样做!)。选修课是一个带有&amp;的字符串。作为将ID分隔为数组的分隔符。 TSRCategories包含包含CompetencySkills的能力。有没有办法在几行中有效地做到这一点?

2 个答案:

答案 0 :(得分:2)

尝试使用this extensions method

using System.Data.Entity;

from x in db.Z.Include(x => x.Competencies)
              .Include(x => x.Competencies.CompetencySkills)
select a.b.c;

按给定的ID列表搜索:

int[] ids = new int[0]; // or List<int>
from x in db.Z
where ids.Contains(x.Id)
select a.b.c;

答案 1 :(得分:2)

您会发现逐个获取关联的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以标准化方式(ClientId, ElectiveId)链接与客户关联的选修。这也将简化您的EF检索代码。

修改

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