代码之家  ›  专栏  ›  技术社区  ›  Sander Rijken

如何重用实体框架查询(使用方法)?

  •  7
  • Sander Rijken  · 技术社区  · 14 年前

    我正在尝试重用查询的一部分,因为它非常复杂,我希望尽量避免代码重复。

    LINQ到实体不识别 方法{X}方法,以及 此方法无法转换为 存储表达式

    var q = from item in context.Items
            where item.SomeCondition == true
            select new {Item = item, Connections = GetConnections(item)};
    

    GetConnections 是对执行查询的方法 item . 我正在尝试在中重用(相当复杂的)查询 ,但我不知道该怎么做。

    IQuerable<Connection> GetConnections(MyItem item)
    
    2 回复  |  直到 14 年前
        1
  •  11
  •   Amy B    14 年前
    Expression<Func<Customer, CustomerWithRecentOrders>>
      GetCustomerWithRecentOrdersSelector()
    {
      return c => new CustomerWithRecentOrders()
      {
        Customer = c,
        RecentOrders = c.Orders.Where(o => o.IsRecent)
      };
    }
    

    后来。。。

    var selector = GetCustomerWithRecentOrderSelector();
    var q = myContext.Customers
      .Where(c => c.SomeCondition)
      .Select(selector);
    
        2
  •  -1
  •   Shirik    14 年前

    你的问题在我看来近乎完美。你当然可以打电话 GetConnections(item) 从你内心的疑问;调用方法是合法的。但是,您还有另一个问题:必须使用成员名称创建匿名类型成员(没有这些名称,您将无法访问它们)。

    var q = from item in context.Items
            where item.SomeCondition == true
            select new {item = item, connections = GetConnections(item)};
    

    item = connections = select

    但是,请注意,您的GetConnections()方法可能需要 static (我的是;我不知道你是不是无意中漏掉了)。