2012-07-26 47 views
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; 
    } 

然而,这从我可以告诉需要两个DB操作来完成,一个以检查记录存在和第二归还。我确信必须有更好的模式/方法,我只是没有看到它。

+0

var profile =(from c in context.UserProfiles where c.UserID == userID select c).First(); – 2012-07-26 14:29:43

+0

使用'FirstOrDefault'它将转化为'SELECT TOP 1',如果没有找到它,结果为'NULL',所以你可以通过Martins的(FirstOrDefault)回答失去任何延伸的'Any'扩展 – Silvermind 2012-07-26 14:30:28

回答

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; 
} 
0

您需要使用First()FirstOrDefault(),而无需调用.Any()

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

First()抛出一个异常,如果没有记录返回,但在这种情况下

FirstOrDefault()返回空双方将生成的SQL是这样的:

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

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

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