2016-04-08 3 views
1

relationControls内のものと重複するDBContextのすべてのNWatchRelationレコードを取得します。 同じId、RelatedNodeId、およびRelationType(enum:int)は、一致とみなされるものでなければなりません。Entity Framework LINQ別のコレクションの一部を取得する

public class NWatchRelation : INWatchRelation 
{ 
    public int Id { get; set; } 
    public int NodeId { get; set; } 
    public NWatchNode Node { get; set; } 
    public int RelatedNodeId { get; set; } 

    public NWatchNode RelatedNode { get; set; } 
    public NWatch.NWatchRelationType RelationType { get; set; } 
} 

INWatchRelation[] relationsCollection = GetRelations(); 
+0

何が質問ですか? –

答えて

1

これらの2つのコレクションの間でLINQ結合を実行できます。

var result = from a in db.NWatchRelations.AsEnumerable() 
      join b in relationsCollection on a.RelatedNodeId equals b.RelatedNodeId 
              && a.Id equals b.Id 
              && a.RelationType equals b.RelationType 
      select a; 
+1

EFがメモリ内のコレクションへの結合をサポートしているとは思わない。 –

+0

'AsEnumerable()'を 'db.NWatchRelations'で叩くと、パフォーマンスは問題になるかもしれませんが、うまくいくはずです。 – juharr

+0

@IvanStoevを絶対に修正してください。指摘してくれてありがとう。 @juhaar。ありがとう。 'AsEnumberale'をインクルードするように更新しました(私は' .ToList() ':)を入れようとしていました) – Shyju

1

あなたはエンティティへのLINQで完全にそれを行うことができる唯一の方法は、手動でこのようなQueryable.Concatを使用してUNION ALLクエリを構成することです。

IQueryable<NWatchRelation> query = null; 
foreach (var relation in relationsCollection) 
{ 
    var m = relation; 
    var subQuery = db.NWatchRelations 
     .Where(r => r.Id == m.Id 
      && r.RelatedNodeId == m.RelatedNodeId 
      && r.RelationType == m.RelationType); 
    query = query == null ? subQuery : query.Concat(subQuery); 
} 

しかし、それは限られたアプローチだということに注意して動作しませんください。 relationsCollectionが大きい場合は

0

次の3つの値を使用して一意のキーの種類を作成することができます。あなたのNWatchRelations表には、多くの行を持っていないか、relationsCollectionが小さなコレクションの場合は、あった選択肢のいずれかを使用してください

//To create a unique key (an string, which is a primitive type) combining the three values 
var keys=relationsCollection.Select(e=>e.Id+"-"+e.RelatedNodeId+"-"+ ((int)e.RelationType)).Distinct(); 

var query=db.NWatchRelations.Where(r=>keys.Any(k=>k == (SqlFunctions.StringConvert((double)r.Id)+"-"+ 
                 SqlFunctions.StringConvert((double)r.RelatedNodeId)+"-"+ 
                 SqlFunctions.StringConvert((double)((int)r.RelationType)))); 

をあなたの納得したところで以前に提案した。

0

また、あなたが直接この

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public NWatchRelation() 
    { 
     this.INWatchRelation = new HashSet<INWatchRelation>(); 
    } 
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<INWatchRelation> INWatchRelation { get; set; } 

のようにリンクされていることができます。しかしentiry関係が適切に

を動作させるためには、次のように言っていなければなりませんあなたが選択することができます次に/この

のようにそれをリスト
db.NWatchRelation.INWatchRelation.ToList();