0

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

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

4

4 回答 4

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;
}
于 2012-07-26T14:28:08.003 回答
1

您需要使用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 ...
于 2012-07-26T14:38:39.673 回答
1

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

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

于 2012-07-26T14:53:31.447 回答
0

您应该使用 Take 方法:

实体框架/Linq to SQL:跳过和采取

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

于 2012-07-26T14:27:54.340 回答