2009-12-07 76 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