代码之家  ›  专栏  ›  技术社区  ›  Andiih

实体框架中避免重复投影代码

  •  5
  • Andiih  · 技术社区  · 16 年前

    我试图解决一个类似于这里描述的问题

    Initializing strongly typed objects in LINQ to Entities

    只从 . 我的存储库中有许多函数,它们都返回相同形状的数据。问题是我的投影代码:

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

    目前,它存在于存储库中的每个查询中。我试着把它移到一个对象初始值设定项中,但这给了我一个可怕的问题:“linqto实体中只支持无参数构造函数和初始值设定项。”。

    我试过分成两个问题

    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);
    

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

    1 回复  |  直到 9 年前
        1
  •  12
  •   Steven    16 年前

    我不确定这对您是否有用,但我经常做的是创建需要 IQueryable 并返回一个 从域对象转换为DTO。它们看起来很像:

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

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

    我希望这有帮助。