我有一個 LINQ 查詢的情況。它有兩個連接(一對多),但它帶回了連接表中的所有列。我不確定如何創建 LINQ 查詢以只回傳連接表中的幾個欄位。
var data = from mc in ctx.MembershipChapters
where mc.PartitionKey == controllerStateManager.PartitionKey && mc.MembershipId == membershipId
join prd in ctx.Products on mc.ProductId
equals prd.Id into prods
from prd in prods.DefaultIfEmpty()
join oli in ctx.OrderLineItems on mc.OrderLineItemId equals oli.OrderLineItemId into olis
from oli in olis.DefaultIfEmpty()
select new
{
MembershipName = mc.Membership.Name,
Products = prods.Select(p => new {
ProductName = p.Name, ProductId = p.Id }),
OrderLineItems = olis.Select(o => new { OrderLineItemName = o.Description, OrderLineItemId = o.OrderLineItemId })
};
controllerStateManager.Data = data.ToList();
這不起作用......我收到一個錯誤:“o”不在范圍內。
基本上輸出應該遵循這個:
MembershipChapter ---> OrderLineItems ----------> 產品
我是 LINQ 的新手,我為此苦苦掙扎了太久。
uj5u.com熱心網友回復:
如果您有一對多關系,并且您想要“一個”專案,每個專案都有零個或多個子專案,例如學校有零個或多個學生;擁有零個或多個訂單的客戶,或者在您的情況下:MembershipChapters 及其 OrderLineItems,考慮使用Queryable.GroupJoin的多載之一。
如果您從“多”方面開始,并且您希望每個專案都有一個父專案,因此您希望學生與他就讀的學校,或訂單與唯一下訂單的客戶,請使用以下其中一個Queryable.Join 的多載。
我幾乎總是使用帶有引數的多載resultSelector,因此您可以準確定義結果中應該包含的內容。
要求:給定表 MembershipChapters、OrderLineItems 和 Products。MembershipChapters 和 OrderLineItems 之間存在一對多的關系。每個MembershipChapter 都有零個或多個OrderLineItem,每個OrderLineItem 只屬于一個MembershipChapter,即外鍵所指的MembershipChapter。OrderLineItems 和 Products 之間存在類似的一對多關系。給我所有(或部分)MembershipChapter,每個MembershipChapter 及其零個或多個OrderlineItem,以及每個OrderLineItem 及其零個或多個產品。
var result = dbContext.MemberShipChapters
.Where(membershipChapter => ...) // only if you don't want all MembershipChapters
.GroupJoin(dbContext.OrderLineItems,
membershipChapter => membershipChapter.Id, // from every membershipChapter get the primary key
orderlineItem => orderLineItem.MembershipChapterId, // from every OrderlineItem get the foreign key
// parameter resultSelector: from every MembershipChapter with its zero or more
// OrderLineItems, make one new:
(membershipChapter, orderLineItemsOfThisMembershipChapter) => new
{
// Select only the membershipChapter properties that you plan to use
Id = membershipChapter.Id,
Name = membershipChapter.Name,
...
// The zero or more OrderLineItems of this membershipChapter
OrderLineItems = orderLineItemsOfThisMembershipChapter
.Select(orderLineItem => new
{
// Select only the OrderLineItems that you plan to use:
Id = orderLineItem.Id,
...
// not needed, you already know the value
// MembershipChapterId = orderLineItem.MembershipChapterId,
})
.ToList(),
});
這是相當簡單的。但是,如果要對三個表進行 GroupJoin,那么這看起來很可怕,盡管它是可行的。
另一種看起來更簡單的方法:
var result = dbContext.MemberShipChapters
.Where(membershipChapter => ...)
.Select((membershipChapter => new
{
Id = membershipChapter.Id,
Name = membershipChapter.Name,
...
OrderLineItems = dbContext.OrderLineItems
// keep only the OrderLineItems with a foreign key referring to this MembershipChapter
.Where(orderLineItem => orderLineItem.MemberShipChapterId == membershipChapter.Id)
.Select(orderLineItem => new
{
Id = orderLineItem.Id,
...
// do the same with the third table
Products = dbContext.Products
.Where(product => product.OrderLineItemId == orderLineItem.Id)
.Select(product => new
{
Id = product.Id,
Price = product.Price,
...
})
.ToList(),
})
.ToList(),
});
uj5u.com熱心網友回復:
這有點難以閱讀,但是如果域鏈接正確,那么我認為您只想以這樣的查詢結束:
from ol in ctx.OrderLines where
ol.MembershipChapter.PartitionKey == controllerStateManager.PartitionKey
select new {ol.Whatever, ol.Product.Whatever};
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/380055.html
上一篇:如何優化查詢-Efcore
