带有EF的Linq包含特定列

时间:2015-07-06 20:49:49

标签: sql linq entity-framework

我有两个班级:

public class Category
{
    public int Id { get; set; }

    [Required]
    [MaxLength(255)]
    public string Name { get; set; }
    public int? CategoryId { get; set; }
    public double Weight { get; set; }
    public ICollection<Article> Articles { get; set; }
    public bool Hidden { get; set; }
}

public class Article
{
    public int Id { get; set; }

    [StringLength(255)]
    public string Title { get; set; }
    public string Body { get; set; }
    public double Weight { get; set; }
    public Category Category { get; set; }
    public int? CategoryId { get; set; }
}

我想选择一些类别,包括文章,但没有Article.Body。方法语法是更优选的。 类似的东西:

IEnumerable<Category> categories = _context
    .Categories
    .Where(c => c.Hidden == false)
    .Include(c => c.Articles)
    .OrderBy(c => c.Weight);

不确定如何指定准确选择(急切地)所包含文章的列。

2 个答案:

答案 0 :(得分:1)

Include不允许投影,您只能包含完整的实体。

但还有一条出路。

这是您应该通过 table splitting 解决的典型案例。通过表格拆分你&#34;拆分&#34;两个(或更多)实体上的表格,因此更容易过滤,例如来自大量数据的轻量数据或来自安全数据的公共数据。

在您的情况下,类模型(对于Article)将如下所示:

public class Article
{
    public int Id { get; set; }

    [StringLength(255)]
    public string Title { get; set; }
    public double Weight { get; set; }
    public Category Category { get; set; }
    public int? CategoryId { get; set; }

    public virtual ArticleBody ArticleBody { get; set; }
}

public class ArticleBody
{
    public int Id { get; set; }
    public string Text { get; set; }
}

和映射:

modelBuilder.Entity<Article>()
            .HasRequired(a => a.ArticleBody)
            .WithRequiredPrincipal();

modelBuilder.Entity<Client>().ToTable("Article");
modelBuilder.Entity<ArticleBody>().ToTable("Article");

现在,如果你这样做......

_context.Categories
        .Where(c => !c.Hidden)
        .Include(c => c.Articles)

...您将看到在生成的SQL中只会选择没有正文的Article个。

如果你想要身体,你也可以

_context.Categories
        .Where(c => !c.Hidden)
        .Include(c => c.Articles.Select(a => a.ArticleBody))

答案 1 :(得分:0)

很抱歉,如果我不理解您的问题,但我认为您可以在select语句中指定所需的列。

简单示例:

var query = from c in Categories
            select c.Name, c.CategoryId;