【问题标题】:FirstOrDefault does not give appropriate answerFirstOrDefault 没有给出适当的答案
【发布时间】:2016-08-03 10:09:54
【问题描述】:

我尝试在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);
  }

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

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

问题出在这里:
{工作正常}--> 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>

{Problem}--> 2. 当我获取用户名“Abbas”且 UserId=4 的记录时,FirstOrDefault 会打印第一次遇到的 UserName="abbas" 的上述数据,并且不会打印 UserName="Abbas"看法。

注意: SingleOrDefault 返回一个异常,告诉它发现了多个实例。

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

【问题讨论】:

  • 问题是什么?
  • 请阅读stackoverflow.com/help/how-to-ask然后编辑问题
  • 好的,我会阅读并尝试根据需要进行编辑。
  • 首先,您应该放弃用户名重复条目的想法。这应该可以解决您面临的非常基本的问题,并且是拥有用户帐户数据的最佳做法。
  • 好的,但如果我的应用程序仍然需要它。因此,我需要找到一种解决方案来处理我的数据的区分大小写问题。正如我正在工作的那样,这样的数据结构将有相同的名称,但区分大小写。

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


【解决方案1】:

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

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

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();

这假设您的用户类是“用户”。

【讨论】:

  • 我会试着告诉你结果。是的,我接受有关设计正确表结构的建议,并将从现在开始为其他表和其他项目实施它
  • 不,它没有按预期工作。字符串比较不起作用
  • 我认为它不起作用,因为它是直接查询数据库并且默认情况下SQL表不承认区分大小写。因此,我用另一种可能的解决方案更新了我的答案,该解决方案使用直接查询数据库的调用。试一试。
  • 我正在使用内置的 microsoft sql server 数据库文件。我会试一试,让你知道结果。感谢您的提示
  • ToList() 将所有记录加载到内存中。将整个表加载到内存然后执行查询是错误的解决方案。当表大小很大时,性能会受到什么影响。查询最好留给数据库执行,唯一的目的就是拥有一个。
【解决方案2】:

EF 后面的 SQL 查询不区分“abbas”/“Abbas”。请运行 SQL Profiler 并查看在调用中执行的查询。

【讨论】:

  • 你能简单介绍一下sql profiler吗?我想知道
  • 我假设您的数据库托管在 SQL Server 中。如果您的数据库托管在 SQL Server 中,Microsoft SSMS 提供了一项称为“SQL Profiler”的功能来跟踪针对您的数据库的所有查询。请转至msdn.microsoft.com/en-in/library/ff650699.aspx
【解决方案3】:

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

如果您坚持用户名可以重复,则执行 FirstOrDefault 并区分大小写搜索。可以试试sn-p代码吗?

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

【讨论】:

  • 它不工作。 FirstOrDefault 仍然不区分“abbas”和“Abbas”.. uhhgg 我被卡住了!!...但是 FirstOrDefault 区分大小写的想法已经足够好了。
猜你喜欢
  • 2012-04-08
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2013-06-13
  • 1970-01-01
  • 2021-10-25
相关资源
最近更新 更多