2016-03-23 8 views
0

Was ist der beste Weg, um eine viele zu viele am Entity Framework beizutreten.viele zu viele linq Abfrage mit like Ausdruck

Ich habe einen Tag Klasse

Lieblings I: Tag Klasse

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

Ich habe eine Dokumenten-Klasse

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

I Karte sie wie dieses:

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

Ich möchte nach allen Dokumenten suchen, die einen Tag-Namen in einem ähnlichen Ausdruck enthalten. Wenn ich dies in SQL zu tun, würde ich dies tun:

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%'; 

Bitte entschuldigen Sie die Tabellennamen und Feldnamen, das war nicht mein Zutun.

Wie kann ich dies mit Linq und Entity Framework tun.

Antwort

1

Die Schönheit des EF ist, dass Sie von jeder Seite und verwenden Sie die Navigationseigenschaft erhalten auf die anderen Seite der many-to-many Beziehung beginnen. Hinter den Kulissen verwendet EF die Tabelle link und die notwendigen Joins.

Zum Beispiel können Sie von DocumentUploadEntity starten:

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

oder Sie können von Tag starten:

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

UPDATE:: Wie @James Dev richtig in den Kommentaren angegeben, die Äquivalent von SQL LIKE 'foo% ist Name.StartsWith("foo").

+0

Sein ähnlicher Operator ist 'foo%', also braucht er ein StartsWith nicht Enthält –

+0

@JamesDev Ah, richtig, danke! –

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

'Select'? Was denkst du ist der ** Typ ** von 'var documents'? –

+0

Gibt die Liste zurück. –

+0

@IvanStoev Sollte SelectMany Ich sehe Ihren Standpunkt. –