FirstOrDefault 没有给出合适的答案
FirstOrDefault does not give appropriate answer
在 FirstOrDefault
的帮助下,我尝试使用 entity framework 从我的 table 获取数据。
控制器代码如下:
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数据如下:
Table 姓名:用户
现在我尝试了很多东西,它可以根据所选的特定记录很好地打印视图中的数据。
问题在这里:
{工作正常}--> 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>
{问题}--> 2. 当我获取用户名 "Abbas" 且 UserId=4 的记录时,FirstOrDefault 会打印出上面第一次遇到的 UserName="abbas" 的数据,但不会打印视图中的用户名="Abbas"。
注:
SingleOrDefault returns 一个异常表明它找到了多个实例。
Update:While 当我更改它从数据库中完美打印的值时进行调试。
EF 后面的 SQL 查询不区分 "abbas" / "Abbas"。请 运行 SQL Profiler 并查看在调用时执行的查询。
首先,您应该放弃重复输入用户名的想法。这应该可以解决您面临的最基本问题,并且是拥有用户帐户数据的最佳做法。
如果您坚持用户名可以重复,则执行 FirstOrDefault
区分大小写的搜索。你能试试代码片段吗?
var rowData = providerEntities.Users.FirstOrDefault(u => u.UserName.Equals(model.UserName));
我同意前面的回答,你不应该有一个根据大小写区分用户名的系统。这表明您的结构设计不当,因此我建议您更改系统。例如,我可以看到您在与用户 table 相同的 table 中拥有 roleid,如果您在此 table 上生成多个登录并区分大小写作为应对不同角色的一种方式对于同一个人,有更好的方法来处理这个问题,从长远来看,这会减少你的悲伤 运行。
但是,如果您想检查是否区分大小写,请尝试:
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();
这假设您的用户 class 是 'Users'。
在 FirstOrDefault
的帮助下,我尝试使用 entity framework 从我的 table 获取数据。
控制器代码如下:
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数据如下: Table 姓名:用户
现在我尝试了很多东西,它可以根据所选的特定记录很好地打印视图中的数据。
问题在这里:
{工作正常}--> 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>
{问题}--> 2. 当我获取用户名 "Abbas" 且 UserId=4 的记录时,FirstOrDefault 会打印出上面第一次遇到的 UserName="abbas" 的数据,但不会打印视图中的用户名="Abbas"。
注:
SingleOrDefault returns 一个异常表明它找到了多个实例。
Update:While 当我更改它从数据库中完美打印的值时进行调试。
EF 后面的 SQL 查询不区分 "abbas" / "Abbas"。请 运行 SQL Profiler 并查看在调用时执行的查询。
首先,您应该放弃重复输入用户名的想法。这应该可以解决您面临的最基本问题,并且是拥有用户帐户数据的最佳做法。
如果您坚持用户名可以重复,则执行 FirstOrDefault
区分大小写的搜索。你能试试代码片段吗?
var rowData = providerEntities.Users.FirstOrDefault(u => u.UserName.Equals(model.UserName));
我同意前面的回答,你不应该有一个根据大小写区分用户名的系统。这表明您的结构设计不当,因此我建议您更改系统。例如,我可以看到您在与用户 table 相同的 table 中拥有 roleid,如果您在此 table 上生成多个登录并区分大小写作为应对不同角色的一种方式对于同一个人,有更好的方法来处理这个问题,从长远来看,这会减少你的悲伤 运行。
但是,如果您想检查是否区分大小写,请尝试:
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();
这假设您的用户 class 是 'Users'。