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

使用联接重用部分查询

  •  2
  • Sander Rijken  · 技术社区  · 16 年前

    我需要实现3个公共方法,它们都依赖于相同的初始联接。下面描述的解决方案是否有效?

    下面的代码是一个例子,真正的东西要复杂得多,这就是我想重用它的原因。

    private Tuple<Customer,Order> GetCustomerOrders()
    {
        from c in customers
        join o in orders
            on c.customerid equals o.customerid
        select Tuple.Create(c, o)
    }
    
    public MyCustomerOrder GetCustomerOrder(int customerId)
    {
        return (from co in GetCustomerOrders()
        where co.Item1.customerid == customerId
        select new MyCustomerOrder(co.Item1, co.Item2)).FirstOrDefault();
    }
    
    public IEnumerable<MyCustomerOrder> GetCustomerOrders()
    {
        return from co in GetCustomerOrders()
        orderby co.Item1.Name
        select new MyCustomerOrder(co.Item1, co.Item2);
    }
    

    问题是,元组是否破坏了查询?换句话说,这会在生成的SQL查询中结束吗 where co.Item1.customerid == customerId ?

    1 回复  |  直到 16 年前
        1
  •  1
  •   Jon Skeet    16 年前

    这实际上取决于LINQtoSQL是否理解 Tuple.Create . 我 在.NET4.0中确实如此,但找到答案的唯一方法是尝试一下。

    这当然会让人感到惊讶 感觉,和可组合性是LINQ目标的一部分-这就是为什么我希望它得到支持。实际上,这就像使用匿名类型一样,只是您可以从方法中“导出”类型信息,这是关键 Tuple