1

我有两个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 );
4

2 回答 2

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();
    }
}
于 2012-04-13T20:41:07.577 回答
0

您是否正在寻找“不在”SQL 类型的操作

LINQ 中的“不在”可以这样实现:

var filterData = new List { "ListA", "ListB" };
var data= context.table.Select( c => c.id ).Except( filterData );
于 2012-04-13T21:05:08.347 回答