FirstOrDefault没有给出相应的答案
我尝试从FirstOrDefault
的帮助下从我的表中使用实体框架获取数据。 控制器代码如下: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.当我获取该记录以用户名“阿巴斯”,因为它获取与用户ID = 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>
{问题} - > 2.当我取得与用户名“阿巴斯”具有用户ID = 4,则FirstOrDefault打印用户名的上述数据=“阿巴斯”作为第一个遇到的和不打印用户名记录= View中的“Abbas”。
注意: SingleOrDefault返回一个异常,指示它找到多个实例。
更新:在调试时,当我更改值时,它完全从数据库打印。
我同意以前的答案,你不应该有一个系统,根据区分大小写区分用户名。这表明你的结构设计不好,所以我会建议改变你的系统。例如,我可以看到你在用户表的同一个表中有roleid,如果你在这张表上以不同的区分大小写生成多个登录作为应对同一个人的不同角色的手段,还有更好的方法来处理这从长远来看会导致你更少的悲伤。
不过,如果你想检查大小写然后尝试:
var rowData = providerEntities.Users.FirstOrDefault(u => u.UserName == model.UserName && String.Compare(u.UserName, model.UserName,false) == 0);
您也可以尝试以下(DB查询):
var rowData = db.Users.ToList().Where(x => (string.Compare(x.UserName, model.UserName, false) == 0)).FirstOrDefault();
这里假设你的用户类是“用户。
我会试着让你知道结果。是的,我接受有关设计适当表格结构的建议,并将从现在开始为其他表格以及其他项目实施它 –
不,它不按预期工作。字符串比较不起作用 –
我认为它不起作用,因为它直接查询数据库并且默认情况下SQL表不承认区分大小写。所以我用另一个可能的解决方案更新了我的答案,它使用直接查询数据库的调用。试一试。 – Rob
EF后面的SQL查询没有区分“abbas”/“Abbas”。请运行SQL Profiler并查看在该调用中执行的查询。
你可以给我一点关于sql profiler的简介。我想知道 –
我假设你的数据库托管在SQL Server中。如果您的数据库托管在SQL服务器中,Microsoft SSMS提供了一项名为“SQL Profiler”的功能来跟踪所有针对数据库的查询。请通过https://msdn.microsoft.com/en-in/library/ff650699.aspx –
好的感谢这样一个有用的提示。 –
首先,你应该放弃重复用户名的条目。这应该解决您所面临的基本问题,并且是拥有用户帐户数据的最佳做法。
如果您坚持用户名可以重复,请使用区分大小写的搜索来执行FirstOrDefault
。你可以尝试一下代码片段吗?
var rowData = providerEntities.Users.FirstOrDefault(u => u.UserName.Equals(model.UserName));
它不工作。 FirstOrDefault仍然没有区分“abbas”和“Abbas”.. uhhgg我被卡住了......但是FirstOrDefault具有区分大小写的想法足够好。 –
是什么问题? –
请阅读http://*.com/help/how-to-ask,然后编辑问题 – MikeT
好吧,我会阅读它并尝试根据需要进行编辑。 –