使用实体框架获取单行,而不获取所有数据

本文关键字:获取 数据 单行 实体 框架 | 更新日期: 2023-09-27 18:26:46

我正在努力了解是否可以在不返回所有数据的情况下使用实体框架从数据库中获取一行。也许我误解了EF的工作原理,但我相信它与以下内容相似:

TBL1

Id | Name           | Place
 1 | Teressa Green  | UK
 2 | Robin Banks    | Germany
 3 | Liam Neeson    | Canada

如果我想让Robin Banks做一些类似的事情

context.tbl1.where(obj => obj.name = "Robin Banks")

然而,据我所知,这是从表中获取所有数据,然后向下过滤到一行。有没有一种方法可以只将一行返回到逻辑,而不首先返回所有数据?

把我的问题放在一句话里。当我只想要1时,我会尽量避免加载回所有行。

使用实体框架获取单行,而不获取所有数据

我认为您需要在此处使用SingleOrDefault

var result= db.yourtable
           .SingleOrDefault(c=>c.Name== "Some Name");

无论何时使用SingleOrDefault,都明确指出查询最多应产生一个结果

这一行实际上不会在数据库上执行任何操作:

context.tbl1.Where(obj => obj.name == "Robin Banks")

它将返回一个IEnumerable<tbl1>,当你开始使用它时,它将被延迟求值。要在数据库上执行实际查询,你需要在IEnumerable<tbl1>上执行枚举(例如foreach.ToList().SingleOrDefault())。此时,EF将把Where()子句转换为实际的SQL,并在数据库上执行它,返回指定的数据。因此,它将获得所有与谓词obj.name="Robin Banks"匹配的数据。它不会使用SQL语句获取tbl1中的所有数据,然后在.NET中过滤结果——这不是它的工作方式。

但是,您可以通过首先使用.ToList():进行枚举来实现这一点(如果需要,但并非100%推荐)

context.tbl1.Where(obj => <some SQL evaluated expression>).ToList()

然后在末尾添加一个附加谓词:

context.tbl1.Where(obj => <some SQL evaluated expression>).ToList().Where(obj => <some .NET evaluated expression>).ToList()

您可以通过对上下文执行以下操作来记录EF生成的实际SQL:

context.Database.Log = Console.WriteLine;

亲眼看看引擎盖下面发生了什么。

您不确定是否存在具有给定密钥的项-->FirstOrDefault

实体框架4 Single()vs First()vs FirstOrDefault()