我试图了解是否可以使用实体框架从数据库中获取单行而不返回所有数据。也许我误解了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时,我试图避免加载所有行。
答案 0 :(得分:4)
我认为你需要在这里使用SingleOrDefault
var result= db.yourtable
.SingleOrDefault(c=>c.Name== "Some Name");
每当您使用SingleOrDefault时,您都清楚地说明查询最多只能产生一个结果
答案 1 :(得分:1)
这一行实际上不会在数据库上执行任何操作:
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;
亲眼看看幕后发生了什么。
答案 2 :(得分:1)
您不确定是否存在具有给定密钥的项目 - &gt; FirstOrDefault