LINQ:麻烦使用Find或Where数据库列表

时间:2014-11-03 15:17:25

标签: c# asp.net-mvc linq entity-framework

我在MVC POST方法中有一些代码。我只是想简单地将ViewModel中返回的用户名与从数据库返回的EF集合进行比较。基本上我想要一个布尔结果。我尝试使用Find,但它不允许我指定Lambda。我尝试使用Where但它返回一个列表,不会让我使用FirstOrDefault。我能帮忙吗?

 [HttpPost]
        public ActionResult Login(LoginModel loginModel)
        {
            try
            {
                using (PrefCenterEntities db = new PrefCenterEntities())
                {
                    var userName = loginModel.UserName;
                    var passWord = loginModel.Password;

                    User pcUser = new User
                    {
                        UserName = userName,
                        Password = passWord
                    };

                    // Find if already exists
                    if (db.Users.Where(y => System.String.Compare(y.UserName, loginModel.UserName, System.StringComparison.OrdinalIgnoreCase) == 0).FirstOrDefault())



                }

1 个答案:

答案 0 :(得分:4)

  

我尝试使用Where但它返回一个列表并且不允许我使用   FirstOrDefault。

您需要Enumerable.Any喜欢:

if (db.Users.Any(y => System.String.Compare(y.UserName, loginModel.UserName, System.StringComparison.OrdinalIgnoreCase) == 0))

如果您要使用FirstOrDefault,请将其与null进行比较,例如:

if (db.Users.Where(y => System.String.Compare(y.UserName, loginModel.UserName, System.StringComparison.OrdinalIgnoreCase) == 0).FirstOrDefault() != null)

if (db.Users.FirstOrDefault(y => System.String.Compare(y.UserName, loginModel.UserName, System.StringComparison.OrdinalIgnoreCase) == 0) != null)

您似乎正在尝试进行不区分大小写的比较,您有两种选择。使用带有参数的string.Equals来指定不敏感的大小写比较,如:

if (db.Users.Any(y => System.String.Equals(y.UserName, loginModel.UserName, System.StringComparison.OrdinalIgnoreCase)))

或者如果将String.Equals转换为谎言数据源语言时出现问题,请将两个值转换为大写,然后比较如下:

if (db.Users.Any(y => y.UserName != null && loginModel.UserName != null &&
                     y.UserName.ToUpper() == loginModel.UserName.ToUpper()))
{
   //record exits. 
}