IEnumerable.except错误

时间:2012-04-13 20:35:54

标签: c# asp.net

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

第二个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 );

2 个答案:

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