【问题标题】:Request only first item Entity Framework仅请求第一项实体框架
【发布时间】:2012-07-26 14:25:38
【问题描述】:

我正在寻找最有效的方法来使用 Entityframework 和 linq 从 SQL Server 数据库中调用第一个也是唯一一个项目。

我正在使用

public static UserProfile GetUserProfile(Guid userID)
    {
        UserProfile oProfile = null;

        using (var context = new MyEntities())
        {
            var profiles = from c in context.UserProfiles where c.UserID == userID select c;

            if(profiles.Any())
            {
                oProfile = profiles.First();
            }
        }

        return oProfile;
    }

然而,据我所知,这需要两个数据库操作来完成,一个检查记录是否存在,第二个返回它。我确信必须有更好的模式/方法,我只是没有看到它。

【问题讨论】:

  • var profile = (from c in context.UserProfiles where c.UserID == userID select c).First();
  • 使用FirstOrDefault,它将转换为SELECT TOP 1,如果找不到,则结果为NULL,因此您可能会丢失Any扩展名

标签: c# asp.net-mvc-3 entity-framework


【解决方案1】:

这很简单:使用 FirstOrDefault()。 当没有条目时,它将返回 null (就像您已经拥有的一样),否则它将返回第一个条目。如果您不希望您的变量采用 null 值,请在两者之间使用替代。

编辑: 您的代码可以同样替换为以下代码,只是这个代码只会查询一次数据库。

public static UserProfile GetUserProfile(Guid userID)
{
    UserProfile oProfile = null;

    using (var context = new MyEntities())
    {
        oProfile = (from c in context.UserProfiles where c.UserID == userID select c).FirstOrDefault();
    }

    return oProfile;
}

【讨论】:

    【解决方案2】:

    如果应该只存在一项(如本例所示),那么您应该考虑使用 Single()。 Single 将返回第一个项目,但如果存在多个项目,则会引发异常 - 如果只存在一个项目,这有助于保持数据质量。

    如果应该只存在一项但它是可选的,则使用 SingleOrDefault 它将充当 Single 但如果不存在则返回 null。

    【讨论】:

      【解决方案3】:

      你需要使用First()FirstOrDefault()而不调用.Any()

      var profile = (from c in context.UserProfiles where c.UserID == userID select c).First();
      

      First() 在没有记录返回但FirstOrDefault() 在这种情况下返回 null 时抛出异常

      两者都会生成这样的 SQL:

      SELECT TOP (1) ...
      FROM ...
      

      【讨论】:

        【解决方案4】:

        你应该使用 Take 方法:

        Entity Framework/Linq to SQL: Skip & Take

        它只需要对数据库进行一次点击。

        【讨论】:

        • 马丁斯 (FirstOrDefault) 的回答有什么理由吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-05
        • 2020-06-10
        • 1970-01-01
        • 2012-01-20
        • 2011-09-28
        • 1970-01-01
        • 2011-04-22
        相关资源
        最近更新 更多