1

IEnumerable<dynamic>データベーステーブルから取得したデータのうち、とという2つのデータがFullSetありますInScopeSubSet

2番目IEnumerable<dynamic>は最初のセットのサブセットです(両方のセットはChildID一意のIDとして持っています)

IEnumerable<dynamic>yでは発生しない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 );
4

2 に答える 2

1

コンパイラエラーを解決するには、2番目の提案を使用します。

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

「含まれていない」SQLタイプの操作を探していますか

LINQの「notin」は次のように実装できます。

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