Entity Framework Core(7):通过id加载单个实体

AsV*_*leO 5 .net c# entity-framework async-await entity-framework-core

.ToListAsync用于从 EF Core 中的 DB 获取项目集合。这很清楚。但是获得单个物品的正确方法是什么?如果可能,以异步方式。

public async static Task<Source> LoadEntityAsync(int sourceID)
{
    using (var db = new RPDBContext())
    {
        var sources =
            await
                db.Source
                    .Where(x => x.SourceID == sourceID)
                    .ToListAsync();
        // TODO that's like a hack:
        return sources.First();
    }
}
Run Code Online (Sandbox Code Playgroud)

Ham*_*jam 5

SingleOrDefaultAsync如果您希望对象是唯一的,则应该使用。如果您知道该对象在域限制中是唯一的,或者如果您通过主键访问它,那么您可以使用FirstOrDefaultAsync.

var sources = await db.Source
            .Where(x => x.SourceID == sourceID)
            .SingleOrDefaultAsync();
Run Code Online (Sandbox Code Playgroud)

您可以使用另一个重载并缩短查询

var sources = await db.Source
            .SingleOrDefaultAsync(x => x.SourceID == sourceID);
Run Code Online (Sandbox Code Playgroud)

同样的规则适用于FirstOrDefaultAsync.

如果您想确保该对象存在,只需删除该OrDefault部分并使用SingleAsyncFirstAsync


Liv*_*osu 4

批准的答案是正确的,但从我的角度来看,这不是最好的答案。

如果您按 ID 搜索,请使用 Find(PropertyID) 方法,如下所示:

db.Source.Find(SourceID)

在哪里:

  • db:数据库上下文
  • 来源:您的实体类型
  • SourceId 是主键

它返回该对象,如果未找到,则返回 null。更多详细信息请参见: https: //learn.microsoft.com/en-us/ef/ef6/querying/# :~:text=The%20Find%20method%20on%20DbSet,context%20or%20in%20the% 20database 。

  • 非常感谢您的澄清。你的答案似乎在性能上确实更好! (2认同)