LINQ:除非以预期的方式工作

时间:2011-07-18 09:49:06

标签: .net vb.net linq ado.net

我无法检测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_IDModified_Time时,也会显示错误,但如果我使用{ {1}}和Ticket_ID列。

注意Interactionsrc是强类型的DataSet,两个DataTable的架构略有不同,但我认为这个问题不仅与LINQ-有关到数据集。

编辑:这些是数据模型(Ticket_ID int,Interaction int,ModifiedAt DateTime)

enter image description here enter image description here

解决方案 :(感谢@Stuart

dest

2 个答案:

答案 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)

在选择列表中,变量的名称,顺序和类型必须相同。