Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将4个表与linq连接到ef_C#_Linq_Entity Framework - Fatal编程技术网

C# 将4个表与linq连接到ef

C# 将4个表与linq连接到ef,c#,linq,entity-framework,C#,Linq,Entity Framework,我有四张桌子/四节课 public Class Brands { public int Id {get;set;} public string Brand {get;set;} public String BrandType {get;set;} } public Class ManufactureA { public int Id {get;set;} public int BrandsId {get;set;} public string Product {get;

我有四张桌子/四节课

public Class Brands
{
  public int Id {get;set;}
  public string Brand {get;set;}
  public String BrandType {get;set;}
}

public Class ManufactureA
{
  public int Id {get;set;}
  public int BrandsId {get;set;}
  public string Product {get;set;} 
  public int Distributor {get;set;}
}

public Class ManufactureB
{
  public int Id {get;set;}
  public int BrandsId {get;set;}
  public string Product {get;set;}
  public int Distributor {get;set;}
}

public Class ManufactureC
{
  public int Id {get;set}
  public int BrandsId {get;set;}
  public string Product {get;set;}
  public int Distributor {get;set;}
}

public Class ManufactureD
{
  public int Id {get;set;}
  public int BrandsId {get;set;}
  public string product {get;set;}
  public int Distributor {get;set;}
}
我试图制作一个表格,显示品牌及其相关制造商的信息。例如:

品牌1:

产品,经销商

品牌2:

产品

品牌3:

产品分销商

品牌4:

产品、经销商

因此,我从这段代码开始,但在决定如何实际分组或项目时感到困惑:

var allBrandsManufactures = from brand in Brands
                            join factoryA in ManufactureA on factoryA.BrandsId equals brand.Id
                            join factoryB in ManufactureB on factoryB.BrandsId equals brand.Id
                            join factoryC in ManufactureC on factoryC.BrandsId equals brand.Id
                            join factoryD in ManufactureD on factoryD.BrandsId equals brand.Id

首先,如果可能的话,你应该考虑重新做数据库设计。您的设计当前在表名称中包含信息。您应该能够将所有制造表合并到一个可能应该称为产品的表中。然后,应该有一个额外的列,以表明它是哪个制造商。像这样

public class Products
{
  public int Id {get;set;}
  public int BrandsId {get;set;}
  public string ProductName {get;set;} 
  public int Distributor {get;set;}
  public string Manufacturer {get;set;}
}
或者,您可以创建一个单独的制造商表,并通过外键将产品表链接到该表,但只有当您想将其他制造商数据放入数据库中时,才真正需要这样做。如果你有一个新的制造商,你就不必创建一个新的表。它还使您的查询更加容易

现在,如果您坚持使用这种设计,那么您将希望使用联合而不是联接。最好的方法是将每个制造商查询分开,然后使用
Concat
将它们组合起来

var brandA = from brand in Brands
         join factoryA in ManufactureA on brand.Id equals factoryA.BrandsId
         select new { 
            Brand = brand.Brand, 
            Product = factoryA.Product, 
            Distributor = factoryA.Distributor, 
            Manufacturer = "A"};

var brandB = from brand in Brands
         join factoryB in ManufactureA on brand.Id equals factoryB.BrandsId
         select new { 
            Brand = brand.Brand, 
            Product = factoryB.Product, 
            Distributor = factoryB.Distributor, 
            Manufacturer = "B"};

var brandC = from brand in Brands
         join factoryC in ManufactureA on brand.Id equals factoryC.BrandsId
         select new { 
            Brand = brand.Brand, 
            Product = factoryC.Product, 
            Distributor = factoryC.Distributor, 
            Manufacturer = "C"};

var brandD = from brand in Brands
         join factoryD in ManufactureA on brand.Id equals factoryD.BrandsId
         select new { 
            Brand = brand.Brand, 
            Product = factoryD.Product, 
            Distributor = factoryD.Distributor, 
            Manufacturer = "D"};

var result = brandA.Concat(brandB).Concat(brandC).Concat(brandD);

当然,您可以选择您想要的任何内容,但您必须在每个查询中选择相同的内容,并为属性使用相同的名称。

我不明白为什么您没有一个
制造商
表和一个
产品
表,而不是每个制造商都有一个单独的产品表。这似乎不是一个可伸缩的设计。你需要进行联合,而不是联合。我觉得它们是我设计逻辑中的一个缺陷。我想如果可以,我会尝试重新设计数据库,如果不行,我肯定会利用工会。感谢您对数据库设计和联盟战略的详细回答。