2011-07-18 28 views
0

我有問題要檢測數據表Email_Total中是否有新行尚未導入到ContactDetail中。LINQ:除了不能以預期的方式工作

Dim srcUnique = From row In src.Email_Total 
       Select row.ticket_id, row.interaction, row.modified_time 
Dim destUnique = From row In dest.ContactDetail 
       Where row.ContactRow.ContactTypeRow.idContactType = emailContactTypeID 
       Select row.ContactRow.Ticket_ID, row.Interaction, row.ModifiedAt 
Dim diff = srcUnique.Except(destUnique) 
Dim needUpdate = diff.Any 

我必須比較多列上的數據,因爲這兩個表中的ID不相等。

此工作原理直到我將row.modified_time/row.ModifiedAt列(兩個DateTime)都添加到select中,因爲行只在所有三個值相等時纔是唯一的。如果我添加的日期列作爲第三個參數以下錯誤(上srcUnique.Except(destUnique))編譯所示:

「System.Data.EnumerableRowCollection(OF <anonymous type>)」不能被轉換爲 「System.Collections.Generic.IEnumerable (Of Out T)中的'Out' 通用參數'T'所需要的,因爲'<anonymous type> (line 471)''不是從'< anonymous type>(line 468) )'

奇怪的是,當我刪除時也顯示錯誤-column from the chosen and leave only Ticket_ID and Modified_Time but it works if we use the Ticket_ID and Interaction columns。

注意srcdest是強類型數據集和數據表都的模式略有不同,但我認爲,這個問題不僅關係到LINQ到數據集。

編輯:這些是datamodels(TICKET_ID INT,相互作用INT,ModifiedAt日期時間)

enter image description hereenter image description here

:(感謝@Stuart

Dim srcUnique = From row In src.Email_Total 
      Select Ticket_ID = row.ticket_id, Interaction = row.interaction, ModifiedAt = row.modified_time 
Dim destUnique = From row In dest.ContactDetail 
       Where row.ContactRow.ContactTypeRow.idContactType = emailContactTypeID 
      Select row.ContactRow.Ticket_ID, row.Interaction, row.ModifiedAt 
+0

你的兩種類型是不同的所以linq不能比較他們 – Manatherin

+0

@ Manatherin:但所有列的類型是相同的,因此我認爲linq會生成相同的匿名類型。 –

回答

3

我不說話VB ...但在C#中你需要讓拼寫(包括大小寫)和所有屬性名稱的類型相同,爲了得到這個工作:

即這會失敗

var srcUnique = from row in src.Email_Total 
      select new { row.ticket_id, row.interaction, row.modified_time }; 
var destUnique = from row in dest.ContactDetail 
      where row.ContactRow.ContactTypeRow.idContactType == emailContactTypeID 
      select new { row.ContactRow.Ticket_ID, row.Interaction, row.ModifiedAt }; 
var diff = srcUnique.Except(destUnique); 

但這會成功:

var srcUnique = from row in src.Email_Total 
      select new { Ticket_ID = row.ticket_id, Interaction = row.interaction, ModifiedAt = row.modified_time }; 
var destUnique = from row in dest.ContactDetail 
      where row.ContactRow.ContactTypeRow.idContactType == emailContactTypeID 
      select new { row.ContactRow.Ticket_ID, row.Interaction, row.ModifiedAt }; 
var diff = srcUnique.Except(destUnique); 

(假設類型相同)

+1

非常感謝。這完美的作品:) –

+0

我怎樣才能根據'srcUnique.Except(destUnique)'的結果得到'Email_Total'的完整行? –

+0

不確定你在問什麼 - 根據結果「完整的行」是什麼?你想根據Ticket_Id查找? – Stuart

1

在選擇列表,變量的名稱,順序和類型必須相同。

+0

我在猜測外鍵Ticket_ID在這裏可以爲空。 –

+0

@Lasse:Ticket_Id不是外鍵。這些都不是fk's,但'Ticket_ID'不是'ContactDetail'的一部分,而是通過fk'fiContact'關聯的父表'Contact'。我不認爲這會導致這個問題,因爲當我從select中刪除它而只保留其他兩列時,錯誤是相同的。來源表'Email_Total'的'fiContact','Ticket_Id'(表'Contact')和'ticket_id'都不能爲空。 –