FirstOrDefault没有给出适当的答案

时间:2016-08-03 10:09:54

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

我尝试在FirstOrDefault的帮助下使用实体框架从我的表中获取数据。 控制器代码如下:

public ActionResult getUser(MembershipModel model)
{
    ProviderImplementation.Edmx.ProviderEntities providerEntities = new ProviderImplementation.Edmx.ProviderEntities();
    //var membershipModel = new MembershipModel(); 
    //var model = ProviderImplementation.Models.MembershipModel;
    //bool isUserOnline = true;
    if (!ModelState.IsValid)
    {
        var isValid = Membership.GetUser(model.UserName, true);
        if (isValid != null)
        {
            var rowData = providerEntities.Users.Where(u => u.UserName.Equals(model.UserName)).FirstOrDefault();
            model.UserName = rowData.UserName;
            model.Password = rowData.Password;
            model.UserId = Convert.ToInt32(rowData.UserId);
            model.RoleId = Convert.ToInt32(rowData.RoleId);
            //var singleValue = providerEntities.Users.Find(model.UserName);
            ViewBag.User = "Found";
        }
        else
        {
            ViewBag.User = "Not Found";
        }
    }
    else
    {
        var error = ModelState.Values.SelectMany(v => v.Errors);
        ModelState.AddModelError("NoModelError", error.ToString());
    }
    return View(model);
  }

我的表格数据如下: 表名:用户

Table containing Table data and columns

现在我尝试了很多东西,它打印好了视图中的数据并选择了特定的记录。

问题出在这里:
{工作正常} - > 1.当我使用用户名“abbas”获取记录时,首先遇到UserId = 2,它会在视图中打印得很好 查看代码是:

  <div style="margin-left: 200px;">
    <table cellpadding="10" cellspacing="10">
        <tr>
            <th>Get User Details</th>
        </tr>
        <tr>
            <th>@ViewBag.User</th>
        </tr>
        <tr>
            <td>@Html.LabelFor(m => m.UserId)</td>
            <td>@Html.LabelFor(m => m.UserName)</td>
            <td>@Html.LabelFor(m => m.Password)</td>
            <td>@Html.LabelFor(m => m.RoleId)</td>
        </tr>
        <tr>
            <td>@Html.DisplayFor(Model=>Model.UserId)</td>
            <td>@Html.DisplayFor(Model=>Model.UserName)</td>
            <td>@Html.DisplayFor(Model=>Model.Password)</td>
            <td>@Html.DisplayFor(Model=>Model.RoleId)</td>
        </tr>
    </table>
</div>

{问题} - GT; 2.当我使用UserId = 4的用户名“Abbas”获取记录时,FirstOrDefault会首先打印上面遇到的UserName =“abbas”的上述数据,并且不会在View中打印UserName =“Abbas”。

注意: SingleOrDefault返回一个异常,告知它找到了多个实例。

更新:在我更改值时进行调试时,它会从数据库中完美打印。

3 个答案:

答案 0 :(得分:0)

EF背后的SQL查询并没有区分&#34; abbas&#34; /&#34;阿巴斯&#34;。请运行SQL事件探查器并查看在呼叫上执行的查询。

答案 1 :(得分:0)

首先,您应该放弃使用重复的用户名条目的想法。这应该可以解决您所面临的非常基本的问题,并且是拥有用户帐户数据的最佳做法。

如果您坚持认为用户名可能重复,请使用区分大小写的搜索执行FirstOrDefault。你可以试试代码片段吗?

var rowData = providerEntities.Users.FirstOrDefault(u => u.UserName.Equals(model.UserName));

答案 2 :(得分:0)

我同意之前的答案,你不应该有一个基于区分大小写区分用户名的系统。这表明您的结构设计不佳,因此我建议您更改系统。我可以看到例如你在与用户表相同的表中有roleid,如果你在这个表上生成多个登录,具有不同的区分大小写作为处理同一个人的不同角色的方法,有更好的方法来处理从长远来看,这将使你更少悲伤。

但是,如果您想检查区分大小写,请尝试:

var rowData = providerEntities.Users.FirstOrDefault(u => u.UserName == model.UserName && String.Compare(u.UserName, model.UserName,false) == 0);

您还可以尝试以下(数据库查询):

var rowData = db.Users.ToList().Where(x => (string.Compare(x.UserName, model.UserName, false) == 0)).FirstOrDefault();

这假定您的用户类是&#39;用户&#39;。