我正在寻找最有效的方法,使用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操作,一个用于检查记录是否存在,另一个用于返回记录。我确定必须有更好的模式/方法,而我却没有看到它。
答案 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)
答案 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 ...