IEnumerable.except error
本文关键字:error except IEnumerable | 更新日期: 2023-09-27 18:31:15
我有两个从数据库表中检索到的数据IEnumerable<dynamic>
,称为FullSet
和InScopeSubSet
。
第二个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 );
若要解决编译器错误,请使用其第二个建议:
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 );