我的目標是查詢和複雜的對象儘可能少開銷儘可能映射。我正在處理一個有大量相關表的大型數據庫。我正在嘗試使用LINQ選擇和投影來選擇只需要製作對象所需的信息。查詢和地圖複雜對象
這是原始查詢我這是快速和偉大的工作。
List<ClientDTO> clientList = dbClients.Select(client =>
new ClientDTO
{
ID = client.ClientID,
FirstName = client.FirstName,
LastName = client.LastName,
//etc....
Products = client.Products
.Select(prod => new ProductDTO
{
ID = prod.ID,
DateOfTransaction = prod.Date,
//etc...
}).ToList(),
Items = client.Items
.Select(item => new ItemDTO
{
ID = item.ID,
Date = item.Date,
//etc...
}
});
記住客戶表中有超過50個相關的表,所以此查詢,它只是選擇我需要使對象下地幹活很大。
現在我需要做的就是讓這些對象映射器,並嘗試建立相同的查詢語句,但這次使用的映射器。這是我最終的結果。
List<ClientDTO> clients = dbClients.ProjectToClientDTO();
使用這些映射器
public static List<ClientDTO> ProjectToClientDTO(this IQueryable<Clients> query)
{
var clientList = query.Select(client => new
{
ID = client.ClientID,
FirstName = client.FirstName,
LastName = client.LastName,
//etc...
Products = client.Products.AsQueryable().ProjectToProductDTO().ToList(),
Items = client.Items.AsQueryable().ProjectToItemDTO().ToList()
}
List<ClientDTO> dtoClientList = new List<ClientDTO>();
foreach (var client in clientList)
{
ClientDTO clientDTO = new ClientDTO();
clientDTO.EncryptedID = EncryptID(client.ID, client.FirstName, client.LastName);
//etc...
clientDTO.Products = client.Products;
clientDTO.Items = client.Items;
}
return dtoClientList;
}
public static IQueryable<ProductDTO> ProjectToProductDTO(this IQueryable<Products> query)
{
return query.Select(prod => new ProductDTO
{
ID = prod.ID,
DateOfTransaction = prod.Date,
//etc...
});
}
public static IQueryable<ItemDTO> ProjectToItemDTO(this IQueryable<Items> query)
{
return query.Select(item => new ItemDTO
{
ID = item.ID,
Date = item.Date,
//etc...
});
}
試圖運行此我得到以下錯誤後。
LINQ實體無法識別方法「ProjectToProductDTO(IQueryable的[產品])」,並且這種方法不能被翻譯成商店表達。「}
我可以LINQ調用這些方法建立查詢? 還是有更好的方式來查詢這些對象沒有抓住不必要的數據50+表的數百家客戶的地圖嗎?
UPDATE
用戶圖科提到,我可以嘗試尋找到表達式樹。讀了一下他們之後,我想出了這個。
public static Expression<Func<Product, ProductDTO>> test = prod =>
new ProductDTO()
{
ID= prod.ID,
Date= prod.Date,
//etc...
};
並以此爲準。
Products = client.Products.Select(prod => test.Compile()(prod)),
但運行此我收到此錯誤。
的LINQ表達式節點類型「調用」不LINQ支撐到實體
EF默認不返回所有的圖形,你必須使用包括每個導航屬性 – Tuco
這難道不叫延遲加載,而不是默認啓用? – Moe
是的,但它不會提取數據,直到您請求它 – Tuco