【问题标题】:Avoiding repeated projection code in Entity Framework避免实体框架中的重复投影代码
【发布时间】:2010-09-05 22:08:00
【问题描述】:

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

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,因为它们在每次使用投影时总是不同的。

那么,我是否必须回到我的投影的多个副本,还是有其他方法可以解决这个问题?

【问题讨论】:

    标签: c# linq entity-framework entity-framework-4


    【解决方案1】:

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

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

    这使我可以将这个投影放在一个地方。我从业务层的几个地方调用了这种方法。

    不过有几点需要注意:

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

    我希望这会有所帮助。

    【讨论】:

    • 几乎 - 它的业务逻辑问题 - 在我的示例中,在投影之前为每个客户评估的 let 语句。
    • 其实这足以给我一个解决方案。我创建了一个新的简化 DTO 中间类,我只需复制六个值即可将其投影到位:每个值都是一个完整的 EF 实体。然后我使用您的解决方案对这些实体进行最终投影。不知道它会如何执行,但它肯定更整洁!
    • @Andiih:您必须使用 SQL 分析器查看在后台执行了多少查询。 EF 将在幕后执行许多查询,这是一个很好的变化。当然,这项技术有其局限性。如果您对性能不满意并且不知道如何在单个查询中获得它,也许我可以帮助您。在这种情况下,请在 SO 此处开始一个新问题,并在此处放置指向该问题的链接。干杯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    相关资源
    最近更新 更多