2013-09-20 3 views
0

У меня есть специальный запрос, который используется для генерации Gridview.DataSource = DataTable, и я пытаюсь получить отдельные (без дубликатов) результаты на основе ID (ActionID), но дубликаты все еще существуют .Использование отдельного ключевого слова в выражении select linq кажется неэффективным. (Все еще борется с linq). Есть ли другой способ сделать это?Получение отличительных значений от linq

DataTable dtSerachResults = new DataTable(); 
string qryStr = @"SELECT Distinct [ActionID] 
            , [Title],convert(varchar(11),[DateRaised],109)as DateRaised 
           , convert(varchar(11) 
           ,[TargetCompletionDate] ,109) as TargetCompletionDate 

           ,dbo.fn_GetPersonelName(fk_PersonnelID) as Responsible 
           ,dbo.fn_GetStatusNameByID(fk_StatusID) as [Status] 
           ,dbo.fn_GetClientNameByID(fk_CustomerID)as Client 
           ,dbo.fn_GetLocationByLocationID(fk_LocationID) as Location 
           ,dbo.fn_GetClientNameByID(fk_CustomerID) as Client 
           ,dbo.fn_GetSourceNameByID(fk_SourceID)as [Source] 
           , dbo.fn_GetPersonelName(fk_RaisedBy) as RaisedBy 
           ,dbo.fn_GetPersonelName(dbo.fn_GetActionItemPrimaryResponsibleEmployeeID([ActionID]))as [Primary] 
           ,DATEDIFF(DD,DateRaised,GETDATE()) as Diff 
           ,IsApproved= 
           case IsApproved 
            when 1 then 'Approved' 
            when 0 then 'Rejected' 
            ELSE 'Waiting' 
           End 
         FROM [ActionTrackerTable] att 
         inner join [dbo].[ActionResponsibilitiesTable] art on art.fk_ActionID=att.[ActionID] "; 

       //title 
       if (!string.IsNullOrEmpty(ActionTracker.Title)) 
       { 
        qryStr += " and Title like '" + ActionTracker.Title + "%'"; 
       } 

       //dateraised 
       if (ActionTracker.DateRaised > DateTime.MinValue) 
       { 
        qryStr += " and DateRaised >= '" + ActionTracker.DateRaised.ToString() + "'"; 
       } 
       //targetgedate 
       if (ActionTracker.TargetCompletionDate > DateTime.MinValue) 
       { 
        qryStr += " and TargetCompletionDate>= '" + ActionTracker.TargetCompletionDate.ToString() + "'"; 
       } 

       //Location 
       if (ActionTracker.Location != null) 
       { 
        qryStr += " and fk_LocationID= " + ActionTracker.Location.LocationID.ToString() + ""; 
       } 
       //client 
       if (ActionTracker.Customer != null) 
       { 
        qryStr += " and fk_CustomerID= " + ActionTracker.Customer.CustomerID.ToString() + ""; 
       } 
       //source 
       if (ActionTracker.Source != null) 
       { 
        qryStr += " and fk_SourceID= " + ActionTracker.Source.SourceID.ToString() + ""; 
       } 
       //approval status 
       if (ActionTracker.SearchApprovalStr == "Approved") 
       { 
        qryStr += " and IsApproved= " + 1.ToString(); 
       } 
       if (ActionTracker.SearchApprovalStr == "Rejected") 
       { 
        qryStr += " and IsApproved= " + 0.ToString(); 
       } 

       if (ActionTracker.SearchApprovalStr == "Waiting") 
       { 
        qryStr += " and IsApproved is null"; 
       } 
       //status 
       if (ActionTracker.Status !=null) 
       { 
        if (ActionTracker.Status.StatusID>0) 
        { 
         qryStr += " and [fk_StatusID]= "+ActionTracker.Status.StatusID.ToString(); 
        } 
       } 

       //ref num 
       if (ActionTracker.ActionTrackerID > 0) 
       { 
        qryStr += " and ActionID = " + ActionTracker.ActionTrackerID.ToString(); 
       } 

       if ((strSearchTerm)=="All" ||(strSearchTerm)=="Select Employee" ) 
       {        )"; 

        //rrun qry 
        //add the order str 
        qryStr += " order by ActionID desc "; 
        System.Data.SqlClient.SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection(); 
        using (sqlConn = ConnectionClass.CreateConnection.publicGetConn()) 
        { 
         sqlConn.ConnectionString = ConnectionClass.CreateConnection.getConnectionString(); 
         sqlConn.Open(); 
         if (sqlConn.State == System.Data.ConnectionState.Open) 
         { 
          using (System.Data.SqlClient.SqlCommand sqlCMD = new System.Data.SqlClient.SqlCommand()) 
          { 
           sqlCMD.CommandText = qryStr; 
           sqlCMD.CommandType = System.Data.CommandType.Text; 
           sqlCMD.Connection = sqlConn; 
           //parameters 
           //no 1 is reponsbile 
           //sqlCMD.Parameters.AddWithValue("@responsibleEmployeeID", responsibleEmployeeID); 

           //return value 

           System.Data.SqlClient.SqlDataReader rdr = sqlCMD.ExecuteReader(); 
           //get dataset 
           DataSet DS = new DataSet(); 
           //load dataset in table 
           DataTable dt = new DataTable(); 
           dt.Load(rdr); 

           DS.Tables.Add(dt); 
       //get Distinct rows based on the Thier rows 


var q2 = (from dr in dt.AsEnumerable() select dr).Distinct().CopyToDataTable(); 
            dtSerachResults = (from dr in dt.AsEnumerable() select dr).Distinct().CopyToDataTable(); 


       } 


      } 

ответ

0

Distinct влияет на все столбцы, а не только на столбец, который предшествует. Вы можете группировать остальные столбцы (и добавлять соответствующие совокупные функции в список выбора). Это будет зависеть от того, как выглядят ваши данные.

Смежные вопросы