FirstOrDefault()方法是处理此场景的好方法

时间:2012-09-05 20:30:47

标签: c# entity-framework entity-framework-4.1

我有一个班级Group,其中包含属于群组成员的用户列表 我使用FirstOrDefault()方法检查打开组页面的用户是否已经在该组中 基于此我显示“加入组”或“离开组”按钮 我只是想知道这是不是这样的场景的好方法还是有更好的方法?

public class Group
{
    public virtual ICollection<UserInGroup> UsersInGroups { get; set; }
    ...
}

详细操作方法我首先加载组,然后检查组中的用户:

public ActionResult Show(int groupId, string title)
{
    GroupViewModel groupiewModel = new GroupViewModel();

    var model = groupsRepository.GetGroupById(groupId);

    groupiewModel.Group = model;

    Guid userId = (Guid)Membership.GetUser().ProviderUserKey;
    var alreadyInGroup = model.UsersInGroups.FirstOrDefault(x => x.UserId == userId);

    if (alreadyInGroup != null)
        groupiewModel.IsInThisGroup = true;
    ...
}

3 个答案:

答案 0 :(得分:7)

我认为Any是更好的选择

bool alreadyInGroup = model.UsersInGroups.Any(x => x.UserId == userId); 

if (alreadyInGroup)
{
     ....

答案 1 :(得分:1)

使用Any而非FirstOrDefault意味着您不会在创建实例上浪费时间。

答案 2 :(得分:1)

我知道您希望在数据库服务器上执行过滤条件。您正在FirstOrDefault上调用IEnumerable,这意味着您正在下载所有用户并在内存中进行过滤。

所以这不是正确的方法。

相反,构建一个LINQ查询并执行它。

在那种情况下,您可以切换到Any