2016-11-07 32 views
0

我在數據庫中有一個重複的字段。我想在下拉列表 中使用它,並且這必須返回不同的數據。用selectlistItem爲下拉列表框返回不同的數據

這是我創建的方法來做到這一點。

  public IEnumerable<SelectListItem> GetBranches(string username) 
       { 
        using (var objData = new BranchEntities()) 
        { 
         IEnumerable<SelectListItem> objdataresult = objData.ABC_USER.Select(c => new SelectListItem 
         { 
          Value = c.BRANCH_CODE.ToString(), 
          Text = c.BRANCH_CODE 
         }).Distinct(new Reuseablecomp.SelectListItemComparer()); 

         return objdataresult; 
        } 

       } 

這是我正在使用的類。

 public static class Reuseablecomp 
      { 
       public class SelectListItemComparer : IEqualityComparer<SelectListItem> 
       { 
        public bool Equals(SelectListItem x, SelectListItem y) 
        { 
         return x.Text == y.Text && x.Value == y.Value; 
        } 

        public int GetHashCode(SelectListItem item) 
        { 
         int hashText = item.Text == null ? 0 : item.Text.GetHashCode(); 
         int hashValue = item.Value == null ? 0 : item.Value.GetHashCode(); 
         return hashText^hashValue; 
        } 
       } 
      } 

什麼都沒有返回。我得到了下面的錯誤。當我嘗試了一個沒有明顯的基本查詢時,一切正常。

 {"The operation cannot be completed because the DbContext has been disposed."} 
     System.Exception {System.InvalidOperationException} 

內部異常= NULL

問:我怎樣才能返回不同的數據,我的下拉?

回答

1

從技術上講,只需在Distinct(...)調用後追加.ToList()即可解決問題。問題是查詢被評估JIT(及時)。換句話說,直到需要查詢表示的實際數據爲止,查詢實際上才被髮送到數據庫。調用ToList就是這樣的事情,它需要實際的數據,因此會立即評估查詢。

但是,問題的根本原因在於您在using聲明中執行此操作。當方法退出時,查詢尚未評估,但您現在已經處理了您的上下文。因此,當實際評估該查詢時,沒有上下文來執行該操作,並且會得到該異常。你應該真的從來沒有使用數據庫上下文結合using。這只是一場災難。理想情況下,你的上下文應該是請求範圍的,你應該使用依賴注入來將它提供給需要它的任何對象或方法。

此外,您可以簡單地將您的Distinct呼叫移動到Select之前,並且您不需要自定義IEqualityComparer。例如:

var objdataresult = objData.ABC_USER.Distinct().Select(c => new SelectListItem 
{ 
    Value = c.BRANCH_CODE.ToString(), 
    Text = c.BRANCH_CODE 
}); 

操作順序在這裏確實很重要。調用Distinct首先將其作爲對數據庫的查詢的一部分,但在調用它之後(如您所做的那樣),將它運行到內存中的集合上,然後再進行評估。後者則需要定製邏輯來確定IEnumerable<SelectListItem>中哪些構成不同的項目,這對於數據庫查詢版本來說顯然不是必需的。

+0

謝謝。我需要比較用戶名==「ndjgkd」的用戶名。我在哪裏可以在你的代碼中包含這個? – user2320476

+0

我不明白。 「like」與「equals」(==)非常不同。這是什麼?並且,比較如何?你想要發生什麼? –

+0

抱歉,我的意思是平等。這是一個錯字 – user2320476