从查询 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 => x.CourseId).FirstOrDefaultAsync();
然后
@MatthiasBurger 非常感谢您的回复。我知道,我是这样做的(我编辑了我的问题)。还是给我这个..
@Sam .. 是的,只需将 FirstOrDefault()
更改为 FirstOrDefaultAsync()
因为您不能等待 int64 :D【参考方案2】:
如果我正确理解您的意图 - 试试这个:
var courseOfGroup = await _applicationContext.PupilGroups
.FirstOrDefault(x => x.Id == groupId)?.CourseId;
【讨论】:
这是正确的,毫无疑问。但更好的解决方案是先到Select(x=>x.CourseId)
然后再做FirstOrDefault()
因为否则,当您只需要CourseId
时,您将从数据库中获取完整的行。 (你永远不知道那一行是什么 - 大 byte[]
-file 还是什么?) - 并且为了检索单值,因为你在主键上获取 SingleOrDefault()
会更好/更清晰。
@Matthias Burger 你是绝对正确的,为抬头欢呼。【参考方案3】:
.FirstOrDefault(x => x.CourseId)
使用 FirstorDefault() 方法返回序列的第一个元素,如果元素不存在,则返回默认值。列表 val = 新列表 ;现在,我们无法显示第一个元素,因为它是一个空集合。为此,请使用 FirstorDefault() 方法显示默认值
【讨论】:
这是不正确的。.FirstOrDefault(...)
方法的参数是在查找适用的第一行时验证的标准,它不是在第一条记录上进行的投影。以上是关于从查询 C#、EF Core 返回一个值的主要内容,如果未能解决你的问题,请参考以下文章
从 c# 查询 MySQL 返回 System.Byte[]