IEnumerable.except error

本文关键字:error except IEnumerable | 更新日期: 2023-09-27 18:31:15

我有两个从数据库表中检索到的数据IEnumerable<dynamic>,称为FullSetInScopeSubSet

第二个IEnumerable<dynamic>是第一个集合的子集(两个集合都有ChildID作为其唯一 ID)

我想创建一个新IEnumerable<dynamic>,其中仅包含 x 中未出现在 y 中的项目

我已经尝试了以下内容,但它无法编译。它说:"无法动态调度扩展方法。考虑强制转换动态参数或调用扩展方法而不使用扩展方法语法"

 var sql = "SELECT ChildID, FirstName, Surname FROM Child ORDER BY ChildID ASC";
 var FullSet =  DB.Query(sql);
 sql = "
 SELECT UserScope.ChildID, Child.FirstName, Child.Surname 
 FROM UserScope 
 INNER JOIN Child ON UserScope.ChildID=Child.ChildID 
 WHERE UserAccountID = @0 ORDER BY ChildID ASC
    ";
 var InScopeSubSet = DB.Query(sql, UserAccount.UserAccountID);
 var OutScopeSubSet  = FullSet .Except(InScopeSubSet );

IEnumerable.except error

若要解决编译器错误,请使用其第二个建议:

var OutScopeSubSet = Enumerable.Except(FullSet, InScopeSubSet);

可枚举的运行正常,但返回整个第一组而不取出任何项目。

如果是这种情况,您可能会在不相同的对象上进行引用比较。 您可以通过实现自定义IEqualityComparer来做到这一点。 调用变为

var OutScopeSubSet = Enumerable.Except(FullSet, InScopeSubSet, new DynamicChildIdComparer());

DynamicChildIdComparer是:

class DynamicChildIdComparer : IEqualityComparer<object>
{
    public bool Equals(object x, object y)
    {
        return ((dynamic)x).ChildID.Equals(((dynamic)y).ChildID);
    }
    public int GetHashCode(object obj)
    {
        return ((dynamic)obj).ChildID.GetHashCode();
    }
}

您是否正在寻找"不在"SQL类型操作中

LINQ 中的"不在"可以像这样实现:

var filterData = new List { "ListA", "ListB" };
var data= context.table.Select( c => c.id ).Except( filterData );