2017-12-27 13 views
1

SQLデータベースのフロントエンドとして機能するasp.net webformsアプリケーションを構築しようとしています。単にテーブルの値を取得LINQ to SQLデータソースを使用し、複数のテーブルにまたがる外部キーでデータバインドを使用するAPOM Webフォーム

see database table relations in this image

は問題ではありません。このように「項目」テーブルから値を表示する例 は:

var items = from i in db.Items 
        select new 
        { 
         ID = i.Item_ID, 
         Name = i.Name, 
         Barcode = i.BarCode, 
         Description = i.Description, 
         ItemType = i.ItemType1.ItemTypeName, 
         LocationCount = i.Location_Item_Juncs.Count 
        }; 
     GridView1.DataSource = items; 
     GridView1.DataBind(); 

looks like this in webforms webpage

問題は、アイテムのためのサプライヤー情報のようなものを得ています。

アイテムには複数の 'Supplier'、 'Location'と 'ReceivedDate'を設定できます。私はこのようにその情報を照会することができますSQLでは

select Supplier.Name, Supplier.Adress, Supplier.Email, Supplier.Phone, Supplier.Supplier_Zipcode 
from item, Supp_Company, Supplier 
where Item_ID = 8 and Item_ID = ItemSub_ID and SupplierJunc_ID = Supplier_ID 

results look like this in linqpad

これらがあり、8

お知らせのアイテムIDを持つアイテムのためのサプライヤーの情報であり、 3つのテーブル(Item、Supp_Company、Supplier)と2組の値が一致して有効な値を選択する必要があります。

私のWebフォームアプリケーションで使用するLINQでそのクエリを複製したいと思います。 この問題の解決方法は、場所を取得してアイテムの「受信日」にも適用されると考えています。

LINQでSQLと同様の 'where'句を使用することはできますか?構文はどのように見えますか?

+0

をあなたがしようとしたことがあり(modelBuilderはエンティティへのすべてのテーブルをマップに気づきます) join-clause)? –

答えて

0

あなたができることは確かに、あなたのマッピングを構築する方法に依存します。 あなたはここで多くのシナリオに多くを持っている、あなたは

  • マップエンティティはリンクテーブルに頼ることができ、リンクエンティティ

リンクテーブルのアプローチに頼る

  • マップエンティティ(気づきますmodelBuilder HasMany WithMany

    void Main() 
    { 
        using (var context = new YourContext()) 
        { 
         var query = from item in context.Items 
            from supplier in item.Suppliers 
            where item.ItemId == 8 
            select new 
            { 
             Name = supplier.Name, 
             Adress = supplier.Address, 
             Email = supplier.Email, 
             Phone = supplier.Phone, 
             Zip = supplier.Zip, 
            }; 
    
         //... 
        } 
    } 
    
    public class YourContext : DbContext 
    { 
        public DbSet<Item> Items { get; set; } 
        public DbSet<Supplier> Suppliers { get; set; } 
    
        public YourContext() : base("MyDb") 
        { 
        } 
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder) 
        { 
         modelBuilder.Entity<Item>() 
          .HasMany(item => item.Suppliers) 
          .WithMany(supplier => supplier.Items) 
          .Map(m => 
          { 
           m.MapLeftKey("ItemSub_ID"); 
           m.MapRightKey("SupplierJunc_ID"); 
           m.ToTable("Supp_Company"); 
          }); 
        } 
    } 
    
    public class Item 
    { 
        public int ItemId { get; set; } 
        public string Name { get; set; } 
        public ICollection<Supplier> Suppliers { get; set; } 
    } 
    
    public class Supplier 
    { 
        public int SupplierId { get; set; } 
        public string Name { get; set; } 
        public string Address { get; set; } 
        public string Email { get; set; } 
        public string Phone { get; set; } 
        public string Zip { get; set; } 
        public ICollection<Item> Items { get; set; } 
    } 
    

    リンクエンティティアプローチ https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/([LINQのは参加]

    void Main() 
    { 
        using (var context = new YourContext()) 
        { 
         var query = from item in context.Items 
            join link in context.SupplierItems 
             on item.ItemId equals link.ItemId 
            join supplier in context.Suppliers 
             on link.SupplierId equals supplier.SupplierId 
            where item.ItemId == 8 
            select new 
            { 
             Name = supplier.Name, 
             Adress = supplier.Address, 
             Email = supplier.Email, 
             Phone = supplier.Phone, 
             Zip = supplier.Zip, 
            }; 
    
         //... 
        } 
    } 
    
    public class YourContext : DbContext 
    { 
        public DbSet<Item> Items { get; set; } 
        public DbSet<Supplier> Suppliers { get; set; } 
        public DbSet<SupplierItem> SupplierItems { get; set; } 
    
        public YourContext() : base("MyDb") 
        { 
        } 
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder) 
        { 
         modelBuilder.Entity<Item>() 
          // ... 
          ; 
    
         modelBuilder.Entity<Supplier>() 
          // ... 
          ; 
    
         modelBuilder.Entity<SupplierItem>() 
          // ... 
          ; 
        } 
    } 
    
    public class Item 
    { 
        public int ItemId { get; set; } 
        public string Name { get; set; } 
    } 
    
    public class Supplier 
    { 
        public int SupplierId { get; set; } 
        public string Name { get; set; } 
        public string Address { get; set; } 
        public string Email { get; set; } 
        public string Phone { get; set; } 
        public string Zip { get; set; } 
    } 
    
    public class SupplierItem 
    { 
        public int ItemId { get; set; } 
        public int SupplierId { get; set; } 
    } 
    
  • +0

    EFコアはリンクテーブルを介して多対多の関係をサポートしていないため、ナビゲーションに必要なすべてのテーブルをマップする必要があることに注意してください –

    関連する問題