如何进行EF Linq查询,包括相关实体的子集

时间:2014-04-11 06:53:21

标签: c# asp.net linq entity-framework sql-server-2012

我有以下课程:

public class Problem
{
    public Problem()
    {
        this.Questions = new HashSet<Question>();
        this.Solutions = new HashSet<Solution>();
    }
    public int ProblemId { get; set; }
    public string Title { get; set; }
    public string Note { get; set; }
    public virtual ICollection<Question> Questions { get; set; }
    public virtual ICollection<Solution> Solutions { get; set; }
}
public class Question
{
    public int QuestionId { get; set; }
    public int ProblemId { get; set; }
    public int QuestionStatusId { get; set; }
    public string Note { get; set; }
    public virtual Problem Problem { get; set; }
}
public class Solution
{
    public int SolutionId { get; set; }
    public int Number { get; set; }
    public int ProblemId { get; set; }
    public bool? Correct { get; set; }
    public string Text { get; set; }
    public string Note { get; set; }
    public virtual Problem Problem { get; set; }
}

有人可以帮助我使用LINQ for my EF6,1 SQL Server 2012。

我想要做的是获取仅包含数据子集的List。在这种情况下,我希望问题,问题和解决方案实体中的Notes属性从数据库中获取 not

请注意,问题和解决方案表已连接到问题表。我不是100%肯定这一点,但我认为这意味着我不需要添加.Include。

理想情况下,我希望EF导致问题的选择不包括Notes列。

2 个答案:

答案 0 :(得分:0)

您可以使用.Select(...)来避免从db中获取冗余数据。下面的代码说明了如何仅使用ProblemId和Title字段获取问题列表:

var result = context.Problems.Select(problem => new { ProblemId = problem.ProblemId , Title = proble.Title }).ToList(); 

使用上面的.Select将生成SQL查询“SELECT p.ProblemId,p.Title from dbo.Problems as p”。 使用.List将检索数据(它将不再依赖于上下文) 您可能会将结果设置为问题类型,例如:

var newResult = result.Select(x=>new Problem() { ProblemId = x.ProblemId, Title = x.Title } )

答案 1 :(得分:0)

您可以使用EF的表格分割功能。创建Problem(PK+all fields except for Notes)ProblemNotes(PK+Notes)个实体。然后查询问题应该满足您的需求。

http://msdn.microsoft.com/en-us/data/jj715645.aspx

使用Entity Framework表拆分,您可以将可能包含大量数据的属性分隔为单独的实体,并仅在需要时加载它。