我有两个班级:
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);
不确定如何指定准确选择(急切地)所包含文章的列。
答案 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;