gpt4 book ai didi

c# - 避免在 Entity Framework 中重复投影代码

转载 作者:太空狗 更新时间:2023-10-29 22:20:45 24 4
gpt4 key购买 nike

我正在尝试解决与此处描述的问题类似的问题

Initializing strongly typed objects in LINQ to Entities

仅来自完全相反的方向。我的存储库中有许多函数,所有函数都返回相同形状的数据。问题是我的投影代码:

select new pocoClass
{
// complex projection that is several pages long includes grabbing a graph of data
}

目前它存在于存储库中的每个查询中。我试过将它移到对象初始值设定项中,但这给了我可怕的“LINQ to Entities 中仅支持无参数构造函数和初始值设定项”。问题。

我确实尝试拆分成两个查询

var candidates = (from thing in _entities.whatever
where (complex.stuff==true)
select thing);

var final = (from thing in candidates.AsEnumerable()
let x = thing.ITEMS.Where(blah=>blah.blah==param)
let y = x.OTHERITEMS.FirstOrDefault()
select new pocoClass(thing,x,y);

但这里 final 始终为 null,并且永远不会调用 new pocoClass 中的代码。我在上面包含了 let x 和 y,因为它们在每次使用投影时总是不同的。

那么,我是否必须返回我的投影的多个副本,或者是否有其他解决方法?

最佳答案

我不确定这是否对您有用,但我经常做的是创建采用 IQueryable 并返回 IQueryable 的投影方法,以从域对象到 DTO。它们看起来很像:

public static IQueryable<CustomerDTO> ToCustomerDTO(
IQueryable<Customer> customers)
{
return
from customer in customers
select new CustomerDTO()
{
...
};
}

这让我可以在一个地方进行投影。我从我业务层的几个地方调用了这样一个方法。

不过有几点需要注意:

  • 确保这些投影方法不包含任何业务逻辑。有任何特定于用例的过滤器都是不好的。
  • 有时您有一个 DTO,其中包含一个复杂的对象图,您希望在单个查询中从数据库中高效地提取它。稍加创意,这通常是可能的,但在返回 IQueryable 时就不行了。在那种情况下,我返回一个 DTO 数组。
  • 我将这些投影方法作为静态方法放在 DTO 类中。虽然这不是一个非常干净的设计,但它发现它使代码非常易于维护。

希望对您有所帮助。

关于c# - 避免在 Entity Framework 中重复投影代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3646266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com