我无法检测DataTable Email_Total
中是否有新行尚未导入ContactDetail
。
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中,因为如果所有三个值都相等,则行只是唯一的。如果我将date-column添加为第三个参数,则编译器会显示以下错误(在srcUnique.Except(destUnique)
上):
'System.Data.EnumerableRowCollection(Of <anonymous type>
)'无法转换为
'System.Collections.Generic.IEnumerable(Of <anonymous type>
)''因为'<anonymous type
&gt;
(第471行)'不是来自'&lt; anonymous type
&gt; (第468行)','出'的要求
'Interface IEnumerable(Of Out T)'中的通用参数'T'
奇怪的是,当我从选择中移除row.Interaction
- 列并仅保留Ticket_ID
和Modified_Time
时,也会显示错误,但如果我使用{ {1}}和Ticket_ID
列。
注意:Interaction
和src
是强类型的DataSet,两个DataTable的架构略有不同,但我认为这个问题不仅与LINQ-有关到数据集。
编辑:这些是数据模型(Ticket_ID int,Interaction int,ModifiedAt DateTime)
解决方案 :(感谢@Stuart)
dest
答案 0 :(得分: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 :(得分:1)
在选择列表中,变量的名称,顺序和类型必须相同。