2016-08-03 67 views
1

我嘗試從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); 
    } 

也是我的表中的數據如下: 表名稱:用戶

Table containing Table data and columns

現在,我嘗試了很多東西它打印以及在視圖中的數據選擇特定的記錄。

問題是這裏:
{工​​作正常} - > 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返回一個異常,指示它找到多個實例。

更新:在調試時,當我更改值時,它完全從數據庫打印。

+1

是什麼問題? –

+0

請閱讀http://stackoverflow.com/help/how-to-ask,然後編輯問題 – MikeT

+0

好吧,我會閱讀它並嘗試根據需要進行編輯。 –

回答

0

我同意以前的答案,你不應該有一個系統,根據區分大小寫區分用戶名。這表明你的結構設計不好,所以我會建議改變你的系統。例如,我可以看到你在用戶表的同一個表中有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(); 

這裏假設你的用戶類是「用戶。

+0

我會試着讓你知道結果。是的,我接受有關設計適當表格結構的建議,並將從現在開始爲其他表格以及其他項目實施它 –

+0

不,它不按預期工作。字符串比較不起作用 –

+0

我認爲它不起作用,因爲它直接查詢數據庫並且默認情況下SQL表不承認區分大小寫。所以我用另一個可能的解決方案更新了我的答案,它使用直接查詢數據庫的調用。試一試。 – Rob

0

EF後面的SQL查詢沒有區分「abbas」/「Abbas」。請運行SQL Profiler並查看在該調用中執行的查詢。

+0

你可以給我一點關於sql profiler的簡介。我想知道 –

+0

我假設你的數據庫託管在SQL Server中。如果您的數據庫託管在SQL服務器中,Microsoft SSMS提供了一項名爲「SQL Profiler」的功能來跟蹤所有針對數據庫的查詢。請通過https://msdn.microsoft.com/en-in/library/ff650699.aspx –

+0

好的感謝這樣一個有用的提示。 –

0

首先,你應該放棄重複用戶名的條目。這應該解決您所面臨的基本問題,並且是擁有用戶帳戶數據的最佳做法。

如果您堅持用戶名可以重複,請使用區分大小寫的搜索來執行FirstOrDefault。你可以嘗試一下代碼片段嗎?

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

它不工作。 FirstOrDefault仍然沒有區分「abbas」和「Abbas」.. uhhgg我被卡住了......但是FirstOrDefault具有區分大小寫的想法足夠好。 –