一個新手問...
第1部分
假設我有 3 個類(以及它們等效的 SQL 表):
Product
{
int Id;
List<Keyword> Keywords;
List<Serial> Serials;
}
Keyword
{
int Id;
int ProductId; // FK to Product
string Name;
}
Serial
{
int Id;
int ProductId; // FK to Product
string SerialNumber;
}
在加載時 PRODUCT == 123,我們可以這樣做:
item = db.Products.FirstOrDefault(p => p.Id == 123);
item.Keywords = db.Keywords.Where(p => p.ProductId == 123).ToList();
item.Serials = db.Serials.Where(p => p.ProductId == 123).ToList();
這是3條SQL陳述句。
或者我們可以這樣做:
from product in db.Products.AsNoTracking()
join link1 in Db.Keywords.AsNoTracking()
on product.Id equals link1.ProductId into kwJoin
from keyword in kwJoin.DefaultIfEmpty()
join link2 in Db.Serials.AsNoTracking()
on product.Id equals link2.ProductId into serJoin
from serial in serJoin.DefaultIfEmpty()
where product.Id == 123
select new { product, keyword, serial };
它給出了 1 個 SQL 陳述句,但產生了太多需要合并在一起的行(關鍵字數 x 序列數)
兩者似乎都不那么有效。有沒有更好的辦法?
第2部分
作為另一個問題,但使用相同的示例,當我們有這樣的連接時:
from product in db.Products.AsNoTracking()
join link1 in Db.Keywords.AsNoTracking()
on product.Id equals link1.ProductId into kwJoin
from keyword in kwJoin.DefaultIfEmpty()
select new { product, keyword };
有沒有辦法直接在產品中分配關鍵字,在 select 陳述句中?
select new { product, product.Keywords = keyword };
謝謝你的幫助!
uj5u.com熱心網友回復:
如果 FK 存在,根據您設定資料庫背景關系的方式,將自動獲取屬性。不需要加入。第 1 部分查詢很簡單,因為它有一個過濾器。第 2 部分可能存在問題,具體取決于需要從資料庫中提取的記錄數。在串列中的每個產品都有關鍵字物件之后,您可以將欄位映射到匿名物件(或 DTO)。
第1部分
item = db.Products
.Include(p=>p.Keywords)
.Include(s=>s.Serials)
.Where(p => p.Id == 123)
.FirstOrDefault();
第2部分
products = db.Products.Include(p=>p.Keywords).ToList();
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/371738.html
