我的目标是查询和复杂的对象尽可能少开销尽可能映射。我正在处理一个有大量相关表的大型数据库。我正在尝试使用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