SQL

2011-01-12 18 views
5

için yeniden kullanılabilir LINQ parçalarının oluşturulması Daha fazla okunabilir hale getirmek için linq - sql sorgularını ayırmaya çalışıyorum.SQL

Önceki yıl içinde 100'den fazla siparişi olan tüm ürün siparişlerini iade etmek istiyorum.

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

sonra beni özgün sorgu için değiştirmenizi sağlar: Ben yapabilmek istiyorum ne

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; 

yeniden kullanılabilir bir işlevi iç içe sorgu koymaktır: Bu sorgu var:

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

Bu bir istisna sorgu çalıştırıldığında yöntem çağrısı SQL'e tercüme edilemez olduğunu söyleyerek ile ancak çalışmaz.

Bunu başarmak için doğru yollarla herhangi bir hızlı ipucu?

+0

Bunu kendim merak ediyordum ama kendimi sormaya bile getiremedim. –

cevap

2

Ne böyle bir şey -

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

?

Üretilen sql'in, orijinal sorgunuz tarafından üretilen ile aynı olduğunu doğrulamak en iyisi olur.

+0

Kesinlikle işe yarıyor. :) –

0

Sadece kalçadan ateş ediyordum, ancak LastSeasonOrders - IQueryable<Order> için değişiklik türü denediniz mi?

+0

Sorun, sorgu sağlayıcısının sorgu içindeki herhangi bir işlev çağrısını işleyememesidir. Fonksiyon, dediğiniz gibi 'IQueryable' iadesi yapmış olmalıydı, ama bu gerçekten sorun değil. Soruyu güncelledim, umarım bundan daha fazla karışıklık olmaz. –