none
關於SQL LINQ 搜尋結果篩選 RRS feed

  • 問題

  • 各位高手,小弟不恥下問。

    各位高手,小弟斗膽請教

    開發環境是VB.net WPF 製作SQL搜尋語法是LINQ

    假設SQL資料表Datalist為:

    Code--Name--Rev

    TS--Report--1

    TS--Report--2

    SC--Proposal--1

    目標是找出

    TS--Report--2

    SC--Proposal--1

    把同Name的資料刪除,日前爬到的文是建議用Distinct,語法是

    Dim AA = (From A In DataList Select A.Name).Distinct

    可是輸出的只有

    Report

    Proposal

    並不是完整資料,想了幾天找了一些資料還是沒有辦法。於是乎我用了一邊文獻的方式用Group by 參考文獻在這

    用Select的方式塞選出新的表單,可是再轉成VB的語法...卡住了,抱歉.....可能基礎太好

                Dim AA = (From A In DataList
                          Group A By A.File_Name Into G = Group
                          Select 卡住)

    所以想請教各位前輩Distinct刪除重複資料的方式,但又要回傳完整表單的方法。


    • 已編輯 LeeEshow 2017年2月3日 上午 07:56 用錯成語被噹了
    2017年1月25日 上午 01:53

解答

  • 抱歉各位前輩,隔了一段時間才回來看這個文。

    目前是用兩個表單的方式處理重複查詢的問題。

    一個表單(Data_Search)只有最新Rev的資料、另一個表單(Data)為全部資料,介面在搜尋的時候是搜尋Data_Search再透過這個表單與Data做連結。

    雖然有點費工但也算是解決本文的問題。

    再次感謝各位指教

    PS:不恥下問:意思,以後會多注意用字。。。。。。。。用語錯誤已改,也請後人注意。

    • 已標示為解答 LeeEshow 2017年2月3日 上午 07:56
    2017年2月3日 上午 07:55

所有回覆

  • 假設有一個Data類別:

    Public Class Data
    
        Public Sub New(ByVal c As String, ByVal n As String, ByVal r As String)
            Code = c
            Name = n
            Rev = r
        End Sub
    
        Public Property Code As String
        Public Property Name As String
        Public Property Rev As String
    
    End Class

    您可以這樣寫:

    Dim arr = New List(Of Data) From
                {
                    New Data("TS", "Report", "1"),
                    New Data("TS", "Report", "2"),
                    New Data("SC", "Proposal", "1")
                }
    
            Dim query = arr.GroupBy(Function(d)
                                        Return d.Name
                                    End Function).Select(Function(g)
                                                             Return g.First()
                                                         End Function).ToList()
    
    
            DataGridView1.DataSource = query

    2017年1月25日 上午 02:31
  • 你這個資料表沒有 PK 嗎? 如果你要刪除一筆資料,需要全部的欄位耶!!

    還有你要目標是找出

    TS--Report--2

    SC--Proposal--1

    這應該是你要保留,你想把TS--Report--1刪掉 ,所以Rev 只留最大的嗎?

    還有 Distinct刪除重複資料的方式,但又要回傳完整表單的方法 甚麼叫做完整表單?


    2017年1月25日 上午 03:58
  • 借 tihs 的例子,

    可取 Rev 最大的

    Sub Main
    	Dim arr = New List(Of Data) From
    	            {
    	                New Data("TS", "Report", 1),
    	                New Data("TS", "Report", 2),
    	                New Data("SC", "Proposal", 1)
    	            }
    	
    	Dim query = From a In arr Group By Code = a.Code, Name= a.Name Into g = Group, MaxRev= Max(a.Rev)
    	'query.dump() 'using LINQPad 
    	For Each q In query
    		Console.WriteLine("Code:{0}, Name:{1}, MaxRev:{2}", q.Code, q.Name, q.MaxRev)
    	Next
    End Sub
    
    ' Define other methods and classes here
    Public Class Data
    
        Public Sub New(ByVal c As String, ByVal n As String, ByVal r As Integer)
            Code = c
            Name = n
            Rev = r
        End Sub
    
        Public Property Code As String
        Public Property Name As String
        Public Property Rev As Integer
    
    End Class

    詳細可參考: MSDN 說明

    https://msdn.microsoft.com/zh-tw/library/bb531412.aspx


    • 已編輯 亂馬客 2017年1月25日 上午 05:31
    2017年1月25日 上午 05:29
  • 你要不要先查國語字典, 搞清楚不恥下問是甚麼意思 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2017年1月25日 下午 12:24
    版主
  • 抱歉各位前輩,隔了一段時間才回來看這個文。

    目前是用兩個表單的方式處理重複查詢的問題。

    一個表單(Data_Search)只有最新Rev的資料、另一個表單(Data)為全部資料,介面在搜尋的時候是搜尋Data_Search再透過這個表單與Data做連結。

    雖然有點費工但也算是解決本文的問題。

    再次感謝各位指教

    PS:不恥下問:意思,以後會多注意用字。。。。。。。。用語錯誤已改,也請後人注意。

    • 已標示為解答 LeeEshow 2017年2月3日 上午 07:56
    2017年2月3日 上午 07:55