2016-03-23 3 views
0

多くの人から多くの人がエンティティフレームワークに参加する最良の方法は何ですか?多くのlinqと同様の式を持つクエリ

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

は、私は、このようにそれらをマッピング私は、文書クラス

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

を持って

好きな 私はタグのクラスに

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

を持つタグクラスを持っています

同じような表現でタグ名を含むドキュメントを検索したい。私は、SQLでこれを行うにした場合、私はこれを行うだろう:

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

テーブル名やフィールド名を言い訳してください、これは私のやっていないでした。

どのようにlinqとエンティティフレームワークでこれを行うことができます。

答えて

1

EFの美しさは、あなたがどちらの側から開始し、many-to-many関係の反対側に到達するためにナビゲーションプロパティを使用することができるということです。背後では、EFはlinkテーブルと必要な結合を使用します。

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

か、Tagから開始することができます:

たとえば、あなたがDocumentUploadEntityから開始することができます

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

UPDATE::@James devが正しくコメントで述べたように、 SQL LIKE 'foo%に相当するのはName.StartsWith("foo")です。

+0

彼の好きな演算子は 'foo%'なので、彼はStartsWithが必要です。含まれていません。 –

+0

@JamesDev Ah、正直、ありがとう! –

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

「選択」?あなたは 'varドキュメント 'の**タイプ**をどう思いますか? –

+0

List を返します。 –

+0

@IvanStoevはSelectManyでなければならない。 –

関連する問題