使用LINQ检查数据库中是否存在记录

时间:2015-11-06 06:45:58

标签: c# linq casting

我在这里收到施法错误,但我不明白为什么。

protected bool isPlayerdb(string userName)
{
    try
    {
        Users adminUsers = from users in SoccerEntities.Users
                           where users.roleId == new Guid("ED85788D-72DA-4D0A-8D5E-B5378FC00592") 
                           && users.UserName == userName
                           select users;

        if (adminUsers != null)
            return true;
        else
            return false;
    }
    catch (Exception ex)
    {
        throw new EntityContextException("isPlayer failed.", ex);
    }
}

调试器出错:

  

错误11无法隐式转换类型   'System.Linq.IQueryable<soccerCmsDal.Users>'到'soccerCmsDal.Users'。存在显式转换(您是否缺少演员?)C:\ new code \ UniteCms \ UniteCms \ soccerCmsDal \ SocerDataAccess.cs 80 23 soccerCmsDal

2 个答案:

答案 0 :(得分:8)

如果您只需要一条记录,请使用FirstOrDefaultSingleOrDefault

Users adminUsers = (from users in SoccerEntities.Users
                           where users.roleId == new Guid("ED85788D-72DA-4D0A-8D5E-B5378FC00592") && users.UserName == userName
                           select users).FirstOrDefault();

如果您需要检查,如果播放器存在,您可以使用Any

bool exists = (from users in SoccerEntities.Users
                           where users.roleId == new Guid("ED85788D-72DA-4D0A-8D5E-B5378FC00592") && users.UserName == userName
                           select users).Any();

答案 1 :(得分:3)

您要求将序列值分配给单个实体变量。这就像尝试这样做:

// Won't work for the same reason
string name = new List<string> { "foo", "bar" };

如果你只是试图找出是否有任何结果,你可以使用Any - 并且过度使用谓词作为参数,所以你不要#&# 39;根本不需要查询表达式。

此外,只要您发现自己写作:

if (condition)
    return true;
else
    return false;

你可以使用:

if (condition)

所以我们最终得到:

protected bool isPlayerdb(string userName)
{
    try
    {
        return SoccerEntities
            .Users
            .Any(user => user.roleId == new Guid("ED85788D-72DA-4D0A-8D5E-B5378FC00592") 
                         && user.UserName == userName)
    }
    catch (Exception ex)
    {
        throw new EntityContextException("isPlayer failed.", ex);
    }
}

请注意:

  • 您的方法名称违反了.NET命名约定 - 请考虑PlayerExists而不是
  • 抓住Exception很少是一个好主意,IME - 考虑捕捉更具体的例外
  • 我已将谓词中使用的变量的名称从users(查询表达式中的范围变量名称)更改为user,因为谓词作用于< em>单个用户。命名对于清晰的代码很重要 - 明确表示您是否正在处理单个实体或多个实体有助于提高可读性。 (这种混乱是导致编译时失败的原因。)