2016-04-08 22 views
1

Tüm ilişkiyi birleştiren DBContext'in tüm NWatchRelation kayıtlarını toplayınCollection. Aynı Kimlik, RelatedNodeId ve RelationType (enum: int) bir eşleşme olarak kabul edilir.Entity Framework LINQ Tüm öğeleri bir başka koleksiyonun parçası olun

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

Soru nedir? –

cevap

1

Bu 2 koleksiyon arasında LINQ birleştirme yapabilirsiniz.

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); 
} 

Ama sınırlı bir yaklaşım olduğuna dikkat ve işe yaramaz edin: Eğer varlıkları için tam LINQ bunu yapabilir

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'in katılımı olmayan koleksiyonlara katılmayı desteklediğini düşünmüyorum. –

+0

Bir 'AsEnumerable()' nı 'db.NWatchRelations' üzerine koyun ve çalışmalıdır, ancak performans sorun olabilir. – juharr

+0

Kesinlikle doğru @IvanStoev. İşaret ettiğin için teşekkürler. @juhaar. Teşekkürler. 'AsEnumberale' ('.ToList() ':)' yi koyacağım. – Shyju

1

tek yolu el ile böyle Queryable.Concat kullanarak UNION ALL sorgu oluşturmak için relationsCollection büyükse.

Üç değerleri kullanarak benzersiz bir tür anahtar oluşturabilir
0

:, sizin NWatchRelations sayıda tablo yoksa veya relationsCollection küçük bir koleksiyon ise

//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)))); 

lütfen idi alternatiflerden birini kullanın daha önce sizin memnuniyetle önerdi.

0

Ayrıca doğrudan bu

[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; } 

gibi bağladığınız olabilir Ama entiry ilişkisi sen/seçmek bu

gibi listeleyebilir düzgün Sonra

çalışması için böyle sevdim olmalıdır

db.NWatchRelation.INWatchRelation.ToList();