从查询 C#、EF Core 返回一个值

Posted

技术标签:

【中文标题】从查询 C#、EF Core 返回一个值【英文标题】:Return one value from query C#, EF Core 【发布时间】:2021-11-06 22:08:11 【问题描述】:

所以这是我获取特定 groupId 课程的方法。我想做的是从数据库表中只获取 CourseId 。此方法现在返回 List。如何仅从表中获取 CourseId 值,而不是从列表中获取?

public async Task<List<PupilGroup>> CheckDoesTeacherCanSeeGroupAsync(long teacherId, long? groupId)
    
        var courseOfGroup = await _applicationContext.PupilGroups
                 .Where(x => x.Id == groupId)
                 .Select(x => new PupilGroup
                 
                     CourseId = x.CourseId
                 )
                 .ToListAsync();
        return courseOfGroup;
    

请指导我

【问题讨论】:

这能回答你的问题吗? How to get Single Value From Database through Entity Framework "gives 'long' 不包含 'GetAwaiter' 的定义...无法在 Google 中找到原因" - 然后我建议学习 C#。 async/await 背后的概念并不完全不在文档中,因为 async 是该语言的核心概念。如果你错过了,你可能会错过很多基础知识。 【参考方案1】:

不将其设为 ToListAsync(),也不将 int 设为 PupilGroup。

.Select (x => x.CourseId).FirstOrDefault();

而不是将其投影到对象中,然后将其转换为列表。请注意,FirstOrDefault 也可能是总和,最小值,等等 - 取决于您实际上是否只有一个项目。

【讨论】:

非常感谢!我还想问:我尝试按照您的建议进行操作,并且仅当我删除了异步内容并长时间公开时才有效...(它给了我“长”不包含“GetAwaiter”的定义...) ,我不是很清楚,为什么会出现这样的错误? @Sam 你需要做await ......Select (x =&gt; x.CourseId).FirstOrDefaultAsync(); 然后 @MatthiasBurger 非常感谢您的回复。我知道,我是这样做的(我编辑了我的问题)。还是给我这个.. @Sam .. 是的,只需将 FirstOrDefault() 更改为 FirstOrDefaultAsync() 因为您不能等待 int64 :D【参考方案2】:

如果我正确理解您的意图 - 试试这个:

var courseOfGroup = await _applicationContext.PupilGroups
                 .FirstOrDefault(x => x.Id == groupId)?.CourseId;

【讨论】:

这是正确的,毫无疑问。但更好的解决方案是先到Select(x=&gt;x.CourseId) 然后再做FirstOrDefault() 因为否则,当您只需要CourseId 时,您将从数据库中获取完整的行。 (你永远不知道那一行是什么 - 大 byte[]-file 还是什么?) - 并且为了检索单值,因为你在主键上获取 SingleOrDefault() 会更好/更清晰。 @Matthias Burger 你是绝对正确的,为抬头欢呼。【参考方案3】:
.FirstOrDefault(x => x.CourseId) 

使用 FirstorDefault() 方法返回序列的第一个元素,如果元素不存在,则返回默认值。列表 val = 新列表 ;现在,我们无法显示第一个元素,因为它是一个空集合。为此,请使用 FirstorDefault() 方法显示默认值

【讨论】:

这是不正确的。 .FirstOrDefault(...) 方法的参数是在查找适用的第一行时验证的标准,它不是在第一条记录上进行的投影。

以上是关于从查询 C#、EF Core 返回一个值的主要内容,如果未能解决你的问题,请参考以下文章

EF Core 执行sql语句

EF Core性能优化

从 c# 查询 MySQL 返回 System.Byte[]

为啥我的 ASP.NET Core 3.1 控制器会自动为从视图返回的 EF Core 模型分配 ID?

从数据库获取值后,C# 中的查询返回 false

LINQ / EF Core 不能在查询中使用 string.Contains