我有以下代碼:
public class ProductTbl
{
public override int Id { get; set; }
public string ProductName { get; set; }
public List<ProductManufacturer> ProductManufacturer { get; set; } //M2M
}
public class Manufacturer_LKP
{
public override int Id { get; set; }
public string ManufacturerName { get; set; }
public List<ProductManufacturer> ProductManufacturer { get; set; } //M2M
}
public class ProductManufacturer
{
public ProductTbl Product { get; set; }
public int ProductID { get; set; }
public Manufacturer_LKP Manufacturer { get; set; }
public int ManufacturerID { get; set; }
}
public class SupplierTbl
{
public int SupplierID { get; set; }
public string SupplierName { get; set; }
}
public class ProductSuppliertbl
{
public int Id { get; set; }
public ProductTbl Product { get; set; }
public int ProductID { get; set; }
public SuppilerTbl Supplier { get; set; }
public int SupplierID { get; set; }
}
*我需要撰寫 Linq 查詢來連接所有 3 個表(Product、Manufacture、ProductManufacturer),以便在一次 DB 行程中同時獲取 ProductName 和 ManufatureName
*當我執行以下操作時,我錯過了 Manufacture 物件(Manufacture=Null)
DbSet<ProductTbl>()
.Where(a => a.Id == 5)
.AsNoTracking()
.Include(a => a.ProductType)
.Include(a => a.ProductManufacturer)
以上 Linq 只是將 Product 表與 ProductManufacture 表聯合起來,所以我無法獲得“ManufactureName”
那么有沒有什么辦法可以在一次 DB 行程中加入 3 個表以在 ProductName 旁邊獲得 ManufactureName ?
uj5u.com熱心網友回復:
嘗試加載相關資料時,投影是您的朋友。多對多的問題是你說一個產品有很多制造商,同時它有很多供應商
產品需要參考該產品的 ProductSuppliers 以輕松管理眾多供應商的需求。
var productData = context.Products
.Select(p => new
{
p.ProductName,
ManufacturerNames = p.ProductManufacturers.Select(pm => pm.Manufacturer.ManufacturerName).ToList(),
SupplierNames = x.ProductSuppliers.Select(ps => ps.Supplier.SupplierName).ToList()
}).ToList();
這為您提供了一個產品串列,其中包含每個產品的相關制造商名稱和供應商名稱。使用這些資料,您可以按照您認為合適的方式格式化輸出。
如果您想要物體本身,那么缺少的位是ThenInclude:
var products = context.Products
.Include(p => p.ProductManufacturers)
.ThenInclude(pm => pm.Manufacturer)
.Include(p => p.ProductSuppliers)
.ThenInclude(ps => ps.Supplier)
.AsNoTracking()
.ToList();
這將加載整個物體圖。
如果您不想或不能在產品中放置 ProductSuppliers 集合,那么您可以完全從 ProductSupplier 構建查詢,但它有點混亂。
如果您使用的是 EF Core 5 并且您的加入物體 (ProductManufacturer/ProductSupplier) 只是對其各自物體的 FK 參考,那么您可以取消加入物體并讓 EF 在幕后管理它。產品將只包含制造商的集合和供應商的集合。這些仍然可以使用 配置HasMany..WithMany,但在沒有中間物體的情況下使查詢更清晰。
IE
var productData = context.Products
.Select(p => new
{
p.ProductName,
ManufacturerNames = p.Manufacturers.Select(m => m.ManufacturerName).ToList(),
SupplierNames = x.Suppliers.Select(s => ps.SupplierName).ToList()
}).ToList();
和
var products = context.Products
.Include(p => p.Manufacturers)
.Include(p => p.Suppliers)
.AsNoTracking()
.ToList();
... 分別。僅當您希望在加入物體中訪問其他屬性時,才需要中間加入物體。(即 CreatedBy/At 等)
uj5u.com熱心網友回復:
嘗試這個
var list = context.ProductManufactures
.Select(i => new
{
ProductName = i.Product.ProductName,
ManufacturerName = i.Manufacturer.ManufacturerName,
SupplierNames = i.Product.ProductSuppliers.Select(s => s.SupplierName).ToList()
}).ToList();
或者你也可以試試這個
var productData = context.Products
.Select(i => new
{
ProductName= i.ProductName,
ManufacturerNames = i.ProductManufacturers.Select(m => m.Manufacturer.ManufacturerName),
SupplierNames = i.ProductSuppliers.Select(s => s.Supplier.SupSupplierName)
}).ToList();
但在此之前你必須修復一些導航屬性
public class Product
{
public int Id { get; set; }
public string ProductName { get; set; }
public List<ProductManufacturer> ProductManufacturers { get; set; }
public List<ProductSupplier> ProductSuppliers { get; set; }
}
public class Supplier
{
public int SupplierID { get; set; }
public string SupplierName { get; set; }
public List<ProductSupplier> ProductSuppliers { get; set; }
}
public class ProductSupplier
{
public int Id { get; set; }
public Product Product { get; set; }
public int ProductID { get; set; }
public Supplier Supplier { get; set; }
public int SupplierID { get; set; }
}
public class Manufacturer_LKP
{
public int Id { get; set; }
public string ManufacturerName { get; set; }
public List<ProductManufacturer> ProductManufacturer { get; set; }
}
public class ProductManufacturer
{
public Product Product { get; set; }
public int ProductID { get; set; }
public Manufacturer_LKP Manufacturer { get; set; }
public int ManufacturerID { get; set; }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/360036.html
上一篇:從兩個不同的物件填充DTO
