2012-04-13 9 views
1

私はFullSetInScopeSubSetと呼ばれるデータベーステーブルから検索された2つのIEnumerable<dynamic>のデータを持っています。IEnumerable.exceptエラー

IEnumerable<dynamic>私はY

に存在しないXからのアイテムのみを含む新しい IEnumerable<dynamic>を作成したい最初のセット(両方のセットは、それらの一意のIDとして ChildIDを有する)

のサブセットであります

私は以下を試しましたが、コンパイルされません。それは言う: 「拡張メソッドを動的にディスパッチすることができないダイナミックな引数をキャストするか、拡張メソッドの構文なしで拡張メソッドを呼び出して考えてみましょう。」その第二の提案を使用し、コンパイラエラーを解決するには

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

DBとは何ですか、DB.Queryはどのような種類のものを返しますか?それは(型付きの)IEnumerableを返さないか、このエラーが出ないでしょう。 –

+0

Database.Query。戻り値は型です。System.Collections.Generic.IEnumerable(Of Object) SQLクエリによって返された行。 – Pinwheeler

+0

あなたの '< >'山括弧が現れるようにするには、テキストをコードとして書式化しなければなりません(ここで行ったように(0120)) – AakashM

答えて

1

を:

var OutScopeSubSet = Enumerable.Except(FullSet, InScopeSubSet); 

The Enumerable one runs ok but returns the whole first set without taking out any items.

そのような場合、あなたはおそらく同じではないオブジェクトの参照比較を取得しています。カスタムの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(); 
    } 
} 
+0

ありがとうございます。クエリ可能なものがエラーを返します。 'System.Linq.Queryable.Except'の最適オーバーロードされたメソッドが一致しました。(System.Linq.IQueryable 、System.Collections.Generic.IEnumerable )に無効な引数があります。 Enumerableは正常に動作しますが、項目を取り出すことなく最初のセット全体を返します。 – Pinwheeler

+0

QueryがIEnumerable を返している場合、最初のクエリは機能しません。問題はあなたが 'object'を取り戻していることにあり、それらの"行 "のうちの2つが"等しい "かどうかを判断する方法がないということです。 –

+0

@CharlotteCopper変数がIQueryableではなくIEnumerableであるため、クエリ可能なバージョンは実行されません。私は答えを投稿したときにそれを見落とした、申し訳ありません。私は悪い例を削除しました。間違った結果については、編集された答えもご覧ください。 – phoog

0

を使用すると、SQLタイプの操作 "ではないで"

は "していない" LINQでこのように実装することができますを探しています:

var filterData = new List { "ListA", "ListB" }; 
var data= context.table.Select(c => c.id).Except(filterData); 
関連する問題