仅请求第一项实体框架

时间:2012-07-26 14:25:39

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

我正在寻找最有效的方法,使用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;
    }

然而,根据我的判断,需要完成两个DB操作,一个用于检查记录是否存在,另一个用于返回记录。我确定必须有更好的模式/方法,而我却没有看到它。

4 个答案:

答案 0 :(得分:4)

这很简单:使用FirstOrDefault()。 当没有条目时,它将返回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;
}

答案 1 :(得分:1)

如果只存在一个项目(在这种情况下看起来如此),那么你应该考虑使用Single()。 Single将返回第一个项目,但如果存在多个项目则抛出异常 - 如果只存在单个项目,这有助于保持数据质量。

如果只有一个项目存在但是它是可选的,那么使用SingleOrDefault作为Single,但如果没有项目则返回null。

答案 2 :(得分:0)

您应该使用Take方法:

Entity Framework/Linq to SQL: Skip & Take

只需要一次点击数据库。

答案 3 :(得分:0)

您需要使用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 ...