【问题标题】:EntityFramework Core 2.0 skip loading columnEntityFramework Core 2.0 跳过加载列
【发布时间】:2017-09-09 02:19:50
【问题描述】:

我正在使用 EF 核心将一些文件保存到 MSSQL 数据库中,其结构类似于

public class UploadedFile
{
    public int Id { get; set; }
    public string Source { get; set; }
    public byte[] Content { get; set; }

我希望能够从数据库中加载“UploadedFiles”列表,而无需实际从数据库中读取内容列。所以我真的不能用

await _context.UploadedFiles.ToListAsync();

我相信我可以在存储过程中使用类似下面的东西。

_context.Set<UploadedFiles>().FromSql("dbo.spGetUploadedFiles")

但是,还有其他不涉及使用存储过程的方法吗?我无法取消映射模型中的列,因为我需要它来插入/读取单个项目。 谢谢。

【问题讨论】:

  • 阅读投影是否违反您的任何要求?例如_context.UploadedFiles.Select(uf => new { uf.Id, uf.Source })?
  • @Eric 我认为你是对的,我可以使用投影。我将尝试实际分析查询,请将其发布为答案

标签: c# entity-framework .net-core entity-framework-core


【解决方案1】:

您基本上可以使用.Select({..) 来指定要返回的列:

public class MyItem
{
    public int Id { get; set; }
    public string Source { get; set; }
}

var data = _context.UploadedFiles
    .Select(p => new MyItem
    {
        Id = p.Id,
        Source = p.Source
    })
    .ToListAsync();

这样你告诉 EF 只为那些列生成选择,仅此而已。如果您愿意,也可以选择像 .Select(p => new { ... }) 这样的匿名对象。

我强烈建议使用强类型。

【讨论】:

  • 谢谢克里斯蒂安,我也喜欢强类型数据(这里需要),但埃里克的回答是第一位的
【解决方案2】:

使用投影:

var results = _context.UploadedFiles.Select(uf => new { uf.Id, uf.Source });

【讨论】:

  • 我最终得到了 _context.UploadedFiles.Select(up => new UploadedFile() { Id = up.Id, Source = up.Source }).ToListAsync();因为我想生成一个 UploadedFile 对象。
猜你喜欢
  • 2021-06-04
  • 2018-03-01
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 2021-08-02
  • 1970-01-01
相关资源
最近更新 更多