我从数据库表中检索到两个IEnumerable<dynamic>
数据,称为FullSet
和InScopeSubSet
。
第二个IEnumerable<dynamic>
是第一个集合的子集(两个集合都有ChildID
作为其唯一ID)
我想创建一个新的IEnumerable<dynamic>
,其中只包含x中不会出现的项目
我尝试过以下但不会编译。它说: “无法动态调度扩展方法。请考虑转换动态参数或调用扩展方法而不使用扩展方法语法”
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 );
答案 0 :(得分:1)
要解决编译器错误,请使用其第二个建议:
var OutScopeSubSet = Enumerable.Except(FullSet, InScopeSubSet);
Enumerable运行正常,但返回整个第一组而不取出任何项目。
如果是这种情况,您可能正在对不相同的对象进行参考比较。您可以通过实现自定义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();
}
}
答案 1 :(得分:0)
您是否正在寻找“不在”SQL类型的操作
LINQ中的“Not in”可以像这样实现:
var filterData = new List { "ListA", "ListB" };
var data= context.table.Select( c => c.id ).Except( filterData );