IEnumerable<;匿名类型#1>;

本文关键字:gt 类型 lt IEnumerable | 更新日期: 2023-09-27 18:29:27

我有一个方法,它使用LINQ对两个DataTable执行不匹配的查询。它产生了一个错误,通过在线查看,我已经确定了错误发生的位置,但我不知道如何修复它

public IEnumerable<int> UnbilledAuditKeys(DataTable audits, string keyFieldName) {
    var billedAudits =
        from x in this.GetBilledAudits().AsEnumerable()
        select new {
            k = x.Field<int>(keyFieldName)
        };
    var allAudits =
        from x in audits.AsEnumerable()
        select new {
            k = x.Field<int>(keyFieldName)
        };
    var unbilled =
        from a in allAudits
        join b in billedAudits on a.k equals b.k
            into combined
        from c in combined.DefaultIfEmpty()
        where c == null
        select new { // This is what's causing the error (I think)
            k = a.k
        };
    return unbilled; // This line the compiler is rejecting
}

返回的错误为

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<AnonymousType#1>' to 'System.Collections.Generic.IEnumerable<int>'. An explicit conversion exists (are you missing a cast?)

我不知道如何修复它。我尝试过将整个LINQ表达式强制转换为IEnumerable之类的显而易见的方法,但这会生成运行时异常。

任何想法都将不胜感激!

编辑:

最后一种方法:

public IEnumerable<int> UnbilledAuditKeys(DataTable rosliAudits, string keyFieldName) {
    var billed = this.GetBilledAudits().AsEnumerable().Select(x => x.Field<int>(keyFieldName));
    var allaudits = rosliAudits.AsEnumerable().Select(x => x.Field<int>(keyFieldName));
    var unbilled = allaudits.Except(billed);
    return unbilled;
}

IEnumerable<;匿名类型#1>;

简单修复:

var unbilled =
    from a in allAudits
    join b in billedAudits on a.k equals b.k
        into combined
    from c in combined.DefaultIfEmpty()
    where c == null
    select a.k;

另外,另外两个查询似乎不需要匿名结构,最后一个查询可以大大简化:

public IEnumerable<int> UnbilledAuditKeys(DataTable audits, string keyFieldName) {
    var billedAudits =
        from x in this.GetBilledAudits().AsEnumerable()
        select x.Field<int>(keyFieldName);
    var allAudits =
        from x in audits.AsEnumerable()
        select x.Field<int>(keyFieldName);
    var unbilled = allAudits.Except(billedAudits); // LINQ has many useful methods like this
    return unbilled;
}

直接选择您的字段,而不是创建新的匿名类型:

var unbilled =
    from a in allAudits
    join b in billedAudits on a.k equals b.k
        into combined
    from c in combined.DefaultIfEmpty()
    where c == null
    select a.k;