【问题标题】:Get single row using Entity Framework without getting all data [duplicate]使用实体框架获取单行而不获取所有数据[重复]
【发布时间】:2016-03-21 01:01:40
【问题描述】:

我试图了解是否可以使用实体框架从数据库中获取单行而不返回所有数据。也许我误解了 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 时,我试图避免加载所有行。

【问题讨论】:

  • “这是从数据库表中获取所有数据,然后过滤到一行” 不,不是。 Entity Framework 将构建一个SELECT * FROM tbl1 WHERE name = 'Robin Banks' 查询并将其传递给数据库服务器,数据库服务器将其作为普通查询执行并将适当的行返回给Entity Framework。
  • 你错了。它将在数据库中过滤而不是在内存中。
  • 只有在你做这样的事情时才会在内存中过滤:context.tbl1.ToList().where(obj=>obj.name="Robin Banks")。因为您首先将所有内容加载到内存中,然后使用 where() 语句过滤数据。但是就像你做的那样,过滤器被应用到数据库上。
  • 干杯伙计们,这就是我想听到的,我找不到任何地方告诉我这个?您能否提供一些您找到此信息的链接?
  • 你要找的是LINQ to Entities

标签: c# .net entity-framework


【解决方案1】:

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

Entity Framework 4 Single() vs First() vs FirstOrDefault()

【讨论】:

    【解决方案2】:

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

    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;
    

    并亲自看看引擎盖下发生了什么。

    【讨论】:

    • 谢谢,这真的很有帮助!
    • @downvoter - 想发表评论吗?
    • 附加信息,此代码 context.Database.Log = Console.WriteLine; 仅适用于 EF6 及更高版本。
    【解决方案3】:

    我认为你需要在这里使用SingleOrDefault

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

    当您使用 SingleOrDefault 时,您明确声明查询最多只能产生一个结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 2013-01-18
      • 2023-03-17
      • 2023-04-06
      • 1970-01-01
      相关资源
      最近更新 更多