2009-12-07 102 views
0

我對這種類型的表codelistvalueview條目:LINQ的GroupBy用在哪裏

我想通過命名空間組,也許再由表名,並找出所有的只發生在條目均命名空間(UPD/REFDAT)然後列出出現在UDP中的那些,以便它們可以被刪除。

namespace tableid tablename count 
UDP 1C06F2EF-5371-4A3F-A07C-226DB7242053 WeldingProcedureSpecification 34 
REFDAT 42D225CA-A96B-4806-9C5C-86D2B3B3AFEE WeldingProcedureSpecification 2 
REFDAT EA0F846C-59B4-4F6D-91D1-B00698C98349 WeldClass 5 
REFDAT E8516DFC-9980-4CBC-B62C-D2C11618424E WasherType 14 

在上述情況下,我需要從第一行中的唯一TABLEID因爲這兩個1 & 2行中出現。我需要的值是,以UDP作爲命名空間的行的tableid(本例中爲第一行)

我認爲這(下面)會讓我得到我想要的,但我得到了一些空行??

var grp = CodelistValueView.Where(x=>x.Namespace=="UDP" || x.Namespace=="REFDAT") 
      .GroupBy(x=>new {x.Namespace, x.TableID, x.TableName}, 
     x=>new {x.Namespace, x.TableID, x.TableName, x.ShortStringValue}) 
      .OrderByDescending(g=>g.Key.TableName) 
      .Select(g=>g.Where(x=>x.Namespace=="UDP").First()); 

grp.Dump(); 

這是我所看到的...

null 
null 
UDP 1c06f2ef-5371-4a3f-a07c-226db7242053 WeldingProcedureSpecification GTAW, SA-789 
null 

有什麼想法?

我終於想出了這一點,似乎工作...不知道這是否是做到這一點的最好辦法。

var grp = CodelistValueView.Where(x=>x.Namespace=="UDP" || x.Namespace=="REFDAT") 
      .Select(x=>new {NS=x.Namespace, Tablename=x.TableName, TableId=x.TableID}) 
     .GroupBy(g=> new {g.NS, g.Tablename, g.TableId}, (g,x)=>g) 
     .GroupBy(x=>x.Tablename, x=>x) 
     .Where(x=>x.Count() > 1) 
     .Select(x=>x.Where(a=>a.NS=="UDP").First())    
     .OrderBy(x=>x.Tablename); 

而且我得到這個:

NS Tablename TableId 
UDP ValveFlowPattern 64bd5be2-0ddb-495a-a0db-28476ebe858d 
UDP ValveOperatorPartDataBasis dcdb1f66-83f1-4738-8587-49a72c63801d 
UDP ValvePortOption 99b1797c-4712-410a-8578-d4a6a01e8968 
UDP WeldingProcedurePractice 682bcc0b-db7a-4b10-80ba-1f969b96abfe 
UDP WeldingProcedureSpecification 1c06f2ef-5371-4a3f-a07c-226db7242053  

感謝 蘇尼特

+0

所以你問這裏的兩個查詢? – Stu 2009-12-07 17:11:29

+0

我不確定。我需要列出出現在UPD中的那些當且僅當它們也出現在REFDAT中。 – Sunit 2009-12-07 17:17:43

+0

請問你能更清楚的問題嗎?你想查找名稱空間中的記錄還是僅在UDP名稱空間中的記錄?對不起,我沒有正確理解你的問題 – 2009-12-07 17:19:17

回答

1

我認爲這會爲你工作,如果我正確地理解這個問題。我使用「codelistvalueview」作爲具有表格數據的集合。

var refdatItems = codelistvalueview.Where(x=>[email protected] == "REFDAT"); 
var udpItems = codelistvalueview.Where(x=>[email protected] == "UDP"); 

var result = 
    from refItem in refdatItems 
    join udpItem in udpItems on refItem.tablename equals udpItem.tablename 
    select udpItem; 

- 或 -

var result = 
    from ref in codelistvalueview 
    join udp in codelistvalueview 
     on ref.tablename = udp.tablename 
    where [email protected] == "REFDAT" && 
      [email protected] == "UDP" 
    select udp; 

結果varable擁有所有的 「UDP」 的項目,也有 「REFDAT」 的項目,他們的表名是相同的。

- 編輯 -

我從您正在使用LinqPad弄清楚這個查詢您的最後一次更新的猜測。太好了,因爲我也使用它。我已更新查詢以使用您挑選的名稱。嘗試在LinqPad中將其作爲「C#程序」運行。它選擇TableID並過濾掉任何重複項。

void Main() 
{ 
    var CodelistValueView = new data[] { 
     new data() {TableName = "1", Namespace="UDP", TableID=1}, 
     new data() {TableName = "1", Namespace="REFDAT", TableID=1}, 
     new data() {TableName = "2", Namespace="UDP", TableID=3}, 
     new data() {TableName = "3", Namespace="REFDAT", TableID=4}, 
     new data() {TableName = "4", Namespace="UDP", TableID=1}, 
     new data() {TableName = "4", Namespace="REFDAT", TableID=1}, 
     new data() {TableName = "5", Namespace="other", TableID=5}, 
     new data() {TableName = "6", Namespace="UDP", TableID=2}, 
     new data() {TableName = "6", Namespace="REFDAT", TableID=2} 
    }; 

    var result = 
     from Ref in CodelistValueView 
     join udp in CodelistValueView 
     on Ref.TableName equals udp.TableName 
     where Ref.Namespace == "REFDAT" && 
       udp.Namespace == "UDP" 
     select udp.TableID; 

    result.Distinct().Dump(); 
} 

// Define other methods and classes here 
class data 
{ 
    public string TableName; 
    public string Namespace; 
    public int TableID; 
} 
+0

這將給我多個條目具有UDP和相同的表名但在其他領域不同的行。 – Sunit 2009-12-07 20:54:54

+0

應該可以工作,但我得到286個條目而不是5個。 – Sunit 2009-12-08 17:10:30