2011-01-12 22 views
5

linqをSQLクエリに分割して、より読みやすくすることを試みています。LINQ to SQLの再利用可能なチャンクを作成する

私は、前年に100件以上の注文があった製品のすべての注文を返すとします。

private IQueryable<Order> LastSeasonOrders(Order order) 
{ 
    return (from o in _context.Orders 
      where o.Year == order.Year - 1 && o.Product == order.Product 
      select o); 
} 

その後、私は、元のクエリにを変更することができます:私は行うことができるようにしたいのですがどのような

from o in _context.Orders 
where (from o1 in _context.Orders 
     where o1.Year == o.Year - 1 && o1.Product == o.Product 
     select o1).Count() > 100 
select o; 

は、再利用可能な機能でネストされたクエリを置くことです:私はこのクエリを持っています:

from o in _context.Orders 
where LastSeasonOrders(o).Count() > 100 
select o; 

ただし、クエリの実行時にメソッド呼び出しをSQLに変換できないという例外はありません。

これを達成するための簡単なヒントを教えてください。

+0

私はこれに疑問を抱いていましたが、自分自身に問いかけてきませんでした。 –

答えて

2

どうのようなものについて -

void Main() 
{ 
    TypedDataContext _context = ... 

    var query = 
     (
      from o in _context.Orders 
      where LastSeasonOrders(_context , o).Count() > 100 
      select o  
     ); 
    ... 
}  


public static Func<TypedDataContext, Order, IQueryable<Order>> 
    LastSeasonOrders = CompiledQuery.Compile 
    ((TypedDataContext _context, Order order) => 

     from o in _context.Orders 
     where o.Year == order.Year - 1 && o.Product == order.Product 
     select o    
);   

生成されたsqlが元のクエリによって生成されたSQLと同じであることを確認することをお勧めします。

+0

これは間違いなく機能します。 :) –

0

私はちょうどヒップから撃っていますが、LastSeasonOrdersからIQueryable<Order>に戻り値のタイプを試しましたか?

+0

問題は、クエリプロバイダがクエリ内の関数呼び出しだけを処理できないことです。あなたが言うように、関数は 'IQueryable'を返すはずですが、実際には問題ではありません。私は質問を更新したのでうまくいけばそれ以上の混乱はありません。 –

関連する問題