2016-03-23 17 views
0

Birçok varlık karması varlık çerçevesini yapmak için en iyi yol nedir.Benzer ifade ile birçok linq sorgusuna çok

modelBuilder.Entity<DocumentUploadEntity>() 
    .HasMany(x => x.Tags) 
    .WithMany(x => x.Documents) 
    .Map(x => 
    { 
     x.ToTable("tblUploadDocumentsTags"); 
     x.MapLeftKey("fld_int_document_id"); 
     x.MapRightKey("fld_int_tag_id"); 
    }); 
:

Ben bu gibi onları map Ben belgeleri sınıf

[Table("tblUploadDocument")] 
    public class DocumentUploadEntity 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     [Column("fld_int_ID")] 
     public int ID { get; set; } 


     public virtual ICollection<Tag> Tags { get; set; } 
    } 

sahip

favori Bir Etiket sınıfı

[Table("tblTags")] 
public class Tag 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [Key] 
    [Column("fld_int_id")] 
    public virtual int Id { get; set; } 

    [Column("fld_str_name")] 
    public virtual string Name { get; set; } 

    public virtual ICollection<DocumentUploadEntity> Documents { get; set; } 
} 

sahip bir etiket sınıf var

Benzer bir ifadede bir etiket adı içeren herhangi bir belgeyi aramak istiyorum. Sql bunu yapmanın olsaydı bunu yapabilirmiydim:

SELECT * FROM tblUploadDocument d 
INNER JOIN tblUploadDocumentsTags ud 
ON fld_int_document_id = d.fld_int_id 
INNER JOIN tbltags t 
ON ud.fld_int_tag_id = t.fld_int_id 
WHERE t.fld_str_name like 'foo%'; 

tablo adları ve alan adlarını Lütfen bağışlayın, bu ben neden oldum değildi.

Bunu linq ve varlık çerçevesiyle nasıl yapabilirim.

cevap

1

EF güzelliği iki tarafında başlayıp many-to-many ilişkinin diğer tarafına geçmek için navigasyon özelliğini kullanabilirsiniz olmasıdır. Sahne arkasında EF, link tablosunu ve gerekli bağlantıları kullanacaktır.

var documents = 
    from document in db.DocumentUploadEntities 
    where document.Tags.Any(tag => tag.Name.Contains("foo")) 
    select document; 

veya Tag başlayabilirsiniz:

Örneğin, DocumentUploadEntity başlayabilirsiniz

var documents = 
    from tags in db.Tags 
    where tag.Name.Contains("foo") 
    from document in tag.Documents 
    select document; 

GÜNCELLEME:: @James Dev doğru yorumların da belirtildiği üzere, SQL LIKE 'foo% eşdeğeri Name.StartsWith("foo")'dur.

+0

Onun gibi işleç 'foo%' dir, o bir StartsWith İçerir –

+0

@JamesDev Ah, doğru, teşekkürler! –

2
var documents = DbContext.Tags.Where(x => x.Name.StartsWith("foo")) 
       .SelectMany(y => y.Documents).ToList() 
+0

'Seç '? Sizce "var belgelerin" ** türü ** olduğunu düşünüyorsunuz. –

+0

Listesini döndürür. –

+0

@IvanStoev SelectMany olmalıdır. –

İlgili konular