2014-01-24 5 views
1

Я собираю список имен из базы данных, согласно сценарию каждое имя существует много раз в базе данных, это нормально. Теперь я наполнил DROPDOWNLIST с этими именами, но в выпадающем списке каждое имя появляется несколько раз:Drop down показывает каждую запись несколько раз

enter image description here

, но я хочу, чтобы отобразить каждые имя 1 разы в списке. Я использовал distict(), но не работал.

ИСПОЛЬЗОВАНИЕ MVC 3, Linq для SQL

контроллера:

namespace EmployeeAttendance_app.Controllers 
{ 
    public class HomeController : Controller 
    { 
     EmployeeAtdDataContext DataContext = new EmployeeAtdDataContext(); 

     public ActionResult Index() 
     { 
      ViewBag.Message = "Precise Technology Consultants"; 

      //var EmployeeAtd = DataContext.GetAttendance_Sp(); 
      IEnumerable<GetAtdRecord_SpResult> EmployeeAtd = DataContext.GetAtdRecord_Sp(null).ToList(); 
      var names = (from n in DataContext.EmployeeAtds select n).Distinct(); 
      //ViewData["EmplID"] = new SelectList(names, "EmplID", "EmplName"); 
      return View(EmployeeAtd); 

     } 
     public ActionResult ddl() 
     { 
      var names = (from n in DataContext.EmployeeAtds select n).Distinct(); 
      ViewData["EmplID"] = new SelectList(names, "EmplID", "EmplName"); 
      return View(); 
     } 
     public ActionResult showDDL(string EmplID) 
     { 
      ViewBag.EmplID = EmplID; 
      return View(); 
     } 

     public ActionResult About() 
     { 
      return View(); 
     } 

Просмотров:

@{ 
    ViewBag.Title = "ddl"; 
} 

<h2>ddl</h2> 

    @using (Html.BeginForm("showDDL", "Home", FormMethod.Get)) 
    { 
     <fieldset> 

       Employers 

       @Html.DropDownList("EmplID", "Select Name") 

      <p> 

       <input type="submit" value="Submit" /> 

      </p> 

     </fieldset> 


    } 

MODEL

amespace EmployeeAttendance_app.Models 
{ 
    using System.Data.Linq; 
    using System.Data.Linq.Mapping; 
    using System.Data; 
    using System.Collections.Generic; 
    using System.Reflection; 
    using System.Linq; 
    using System.Linq.Expressions; 
    using System.ComponentModel; 
    using System; 


    [global::System.Data.Linq.Mapping.DatabaseAttribute(Name="a1")] 
    public partial class EmployeeAtdDataContext : System.Data.Linq.DataContext 
    { 

     private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource(); 

    #region Extensibility Method Definitions 
    partial void OnCreated(); 
    #endregion 

     public EmployeeAtdDataContext() : 
       base(global::System.Configuration.ConfigurationManager.ConnectionStrings["a1ConnectionString"].ConnectionString, mappingSource) 
     { 
      OnCreated(); 
     } 

     public EmployeeAtdDataContext(string connection) : 
       base(connection, mappingSource) 
     { 
      OnCreated(); 
     } 

     public EmployeeAtdDataContext(System.Data.IDbConnection connection) : 
       base(connection, mappingSource) 
     { 
      OnCreated(); 
     } 

     public EmployeeAtdDataContext(string connection, System.Data.Linq.Mapping.MappingSource mappingSource) : 
       base(connection, mappingSource) 
     { 
      OnCreated(); 
     } 

     public EmployeeAtdDataContext(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) : 
       base(connection, mappingSource) 
     { 
      OnCreated(); 
     } 

     public System.Data.Linq.Table<EmployeeAtd> EmployeeAtds 
     { 
      get 
      { 
       return this.GetTable<EmployeeAtd>(); 
      } 
     } 

     [global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.GetAtdRecord_Sp")] 
     public ISingleResult<GetAtdRecord_SpResult> GetAtdRecord_Sp([global::System.Data.Linq.Mapping.ParameterAttribute(Name="EmplID", DbType="Int")] System.Nullable<int> emplID) 
     { 
      IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), emplID); 
      return ((ISingleResult<GetAtdRecord_SpResult>)(result.ReturnValue)); 
     } 
    } 

    [global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.V_EmployeeAtd")] 
    public partial class EmployeeAtd 
    { 

     private string _EmplID; 

     private string _EmplName; 

     private string _RecDate; 

     private string _RecTime; 

     private string _DeptName; 

     public EmployeeAtd() 
     { 
     } 

     [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_EmplID", DbType="Char(8) NOT NULL", CanBeNull=false)] 
     public string EmplID 
     { 
      get 
      { 
       return this._EmplID; 
      } 
      set 
      { 
       if ((this._EmplID != value)) 
       { 
        this._EmplID = value; 
       } 
      } 
     } 

     [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_EmplName", DbType="NVarChar(40) NOT NULL", CanBeNull=false)] 
     public string EmplName 
     { 
      get 
      { 
       return this._EmplName; 
      } 
      set 
      { 
       if ((this._EmplName != value)) 
       { 
        this._EmplName = value; 
       } 
      } 
     } 

     [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_RecDate", DbType="Char(10)")] 
     public string RecDate 
     { 
      get 
      { 
       return this._RecDate; 
      } 
      set 
      { 
       if ((this._RecDate != value)) 
       { 
        this._RecDate = value; 
       } 
      } 
     } 

     [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_RecTime", DbType="Char(5)")] 
     public string RecTime 
     { 
      get 
      { 
       return this._RecTime; 
      } 
      set 
      { 
       if ((this._RecTime != value)) 
       { 
        this._RecTime = value; 
       } 
      } 
     } 

     [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_DeptName", DbType="NVarChar(50)")] 
     public string DeptName 
     { 
      get 
      { 
       return this._DeptName; 
      } 
      set 
      { 
       if ((this._DeptName != value)) 
       { 
        this._DeptName = value; 
       } 
      } 
     } 
    } 

    public partial class GetAtdRecord_SpResult 
    { 

     private string _EmplID; 

     private string _EmplName; 

     private string _InTime; 

     private string _OutTime; 

     private string _DateVisited; 

     private string _TimeWorked; 

     private string _OverTime; 

     public GetAtdRecord_SpResult() 
     { 
     } 

     [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_EmplID", DbType="Char(8) NOT NULL", CanBeNull=false)] 
     public string EmplID 
     { 
      get 
      { 
       return this._EmplID; 
      } 
      set 
      { 
       if ((this._EmplID != value)) 
       { 
        this._EmplID = value; 
       } 
      } 
     } 

     [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_EmplName", DbType="NVarChar(40) NOT NULL", CanBeNull=false)] 
     public string EmplName 
     { 
      get 
      { 
       return this._EmplName; 
      } 
      set 
      { 
       if ((this._EmplName != value)) 
       { 
        this._EmplName = value; 
       } 
      } 
     } 

     [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_InTime", DbType="Char(5)")] 
     public string InTime 
     { 
      get 
      { 
       return this._InTime; 
      } 
      set 
      { 
       if ((this._InTime != value)) 
       { 
        this._InTime = value; 
       } 
      } 
     } 

     [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_OutTime", DbType="Char(5)")] 
     public string OutTime 
     { 
      get 
      { 
       return this._OutTime; 
      } 
      set 
      { 
       if ((this._OutTime != value)) 
       { 
        this._OutTime = value; 
       } 
      } 
     } 

     [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_DateVisited", DbType="Char(10) NOT NULL", CanBeNull=false)] 
     public string DateVisited 
     { 
      get 
      { 
       return this._DateVisited; 
      } 
      set 
      { 
       if ((this._DateVisited != value)) 
       { 
        this._DateVisited = value; 
       } 
      } 
     } 

     [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TimeWorked", DbType="Char(5)")] 
     public string TimeWorked 
     { 
      get 
      { 
       return this._TimeWorked; 
      } 
      set 
      { 
       if ((this._TimeWorked != value)) 
       { 
        this._TimeWorked = value; 
       } 
      } 
     } 

     [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_OverTime", DbType="VarChar(6)")] 
     public string OverTime 
     { 
      get 
      { 
       return this._OverTime; 
      } 
      set 
      { 
       if ((this._OverTime != value)) 
       { 
        this._OverTime = value; 
       } 
      } 
     } 
    } 
} 

восстановить предупреждение Прагма 1591

ответ

1

Я думаю, что вы реализуете отличие от п, который содержит все свойства класса. Вам нужно применять только отдельные столбцы. Как

var empList= DataContext.EmployeeAtds.Select(n => new 
     { 
      EmplID= n.EmplID, 
      EmplName= n.EmplName 
     }).Distinct().ToList(); 

ИЛИ

var empList= (from n in DataContext.EmployeeAtds select new{ EmplID= n.EmplID, 
      EmplName= n.EmplName}).Distinct(); 
+0

wow второй запрос работал, но почему и как? я не понимаю разницы –

+1

Потому что в предыдущем запросе ядро ​​работало только на двух обязательных столбцах. «Выбрать» исключены остальные столбцы, за которые отвечали за повторные записи. – nitish

1

Вам необходимо убедиться, что ваш основной объект переопределяет GetHashCode и Equals, чтобы он работал правильно.

Пожалуйста, смотрите здесь для получения дополнительной информации:

http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

В качестве примера, если у вас есть объект с именем EmployeeAtd необходимо реализовать вышеуказанные два способа, чтобы знать, когда сравнительные объекты равны.

Это простой пример, но вы можете рассмотрите EmployeeAtd объекты такие же, если у них есть соответствующие EmplID, пример Равно коррекция может быть:

public override bool Equals(object obj) 
{ 
    if (obj == null) return false; 

    if (this.GetType() != obj.GetType()) return false; 

    EmployeeAtd emp = (EmployeeAtd) obj;  

    if (!Object.Equals(EmplID, emp.EmplID)) return false; 

    return true; 
} 

Если ваш EmplID является ИНТОМ вы могли бы просто реализовать GetHashCode следующим образом:

public override int GetHashCode() 
{ 
    return EmplID.GetHashCode(); 
} 

Это не лучшая практика, но есть много других вопросов о том, как это сделать.

What is the best way to implement this composite GetHashCode()

Why is it important to override GetHashCode when Equals method is overridden?

+0

извините, я не получил ты, пожалуйста, если вы могли бы сказать, что в простых словах, –

+0

Конечно, дайте мне несколько минут. : – hutchonoid

+0

спасибо, сэр, я потратил почти день на его исправление, но не смог, если вы можете его исправить, пожалуйста, у меня есть другие задачи, которые нужно сделать, чтобы сэкономить мое время. –

1

Вы можете использовать DISTINCT безопасно, я не уверен, где именно вы столкнулись с проблемой. Пожалуйста, следуйте этому примеру.Скажем, у меня есть таблица базы данных таким образом - enter image description here

Затем я пишу следующую сохраненную процедуру

USE [Sample] 
GO 

CREATE PROCEDURE GiveNames 
AS 
SELECT DISTINCT(Name) FROM [dbo].[SampleTable] 
GO 

Затем я создаю проект MVC и добавить EDMX и использовать содержимое в контроллер следующим способом -

public class EdmxController : Controller 
{ 
    // 
    // GET: /Edmx/ 
    public ActionResult Index() 
    { 
     DDLModel model = new DDLModel(); 
     model.Items = new List<string>(); 

     using (var entities = new SampleEntities1()) 
     { 
      model.Items = entities.GiveNames().ToList(); 

     } 
     return View(model); 
    } 
} 

public class DDLModel 
{ 
    public List<String> Items { get; set; } 
} 

My View -

@model MVC.Controllers.DDLModel 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

<div> 
    @Html.DropDownList("MyDDL",new SelectList(Model.Items), "--Choose any Item--") 
</div> 

И мой выход не ведет никаких дубликатов -

enter image description here