2012-03-14 9 views
5

Şu anda LINQ ile bazı temel bilgileri anlamaya çalışıyorum. Netflix OData kaynağını sorgulamak için LINQPad kullanıyordum.LINQ Lambda sorgu 'select' oData ile çalışmıyor Not

Kaynak: Bir lambda sorgusu kullanırken tek özelliklerini seçmek için görünmüyor olabilirhttp://odata.netflix.com/v2/Catalog/

- anlama sorgusu mükemmel çalışıyor. Netflix oData kaynağında lambda'ları kullanarak daha karmaşık bir sorgu gerçekleştiren bir kod pasajı buldum ve bu, varlığın bir özelliğini döndürmek için iyi çalışıyor gibi görünüyor.

// works fine 
var compQuery = from t in Titles 
       where t.ReleaseYear == 2007 
       select new { t.Name }; 
compQuery.Dump(); 



// fails: "Can only specify query options (orderby, where, take, skip) after last navigation." 
var lambdaQuery = Titles 
      .Where(t => t.ReleaseYear == 2007) 
      .Select(t => t.Name); 

lambdaQuery.Dump(); 


// works fine - found on SO. 
var lambdaQuery2 = People 
    .Expand("TitlesActedIn") 
    .Where(p => p.Name == "George Lucas") 
    .First() 
    .TitlesActedIn.Select(t => t.ShortName);    

lambdaQuery2.Dump(); 

kimse temel lambda sorgu zaman bir özellik geri dönmeleri istendi başarısız neden olarak biraz ışık tutmak misiniz?

cevap

4

o aslında eşdeğer budur bu- deneyin senin ilki:

// fails: "Can only specify query options (orderby, where, take, skip) after last navigation." 
var lambdaQuery = Titles 
      .Where(t => t.ReleaseYear == 2007) 
      .Select(t => new { t.Name }); 

lambdaQuery.Dump(); 
+0

ahhh, Bunu şimdi denedim ve işe yarıyor! - Anlamadığım şey, diğer lambda sorgusunun (insanlar) projeksiyon için anonim bir tip oluşturmamı gerektirmemesidir. – Dal

+0

Bunun için “.First()' yi çağırırsınız, sonuçta sonuçları yansıtır, tüm kaydı kapatır ve sonra istemcideki bellekteki özellikleri seçer. –

+0

Anonim tür kullanımını neden gerektirdiğini açıklar mısınız? Teşekkürler –

12

OData özelliklerine projelendirme desteği yok - bu olsa çalışabilirsiniz:

var lambdaQuery = Titles 
      .Where(t => t.ReleaseYear == 2007) 
      .Select(x=> new { x.Name }) 
      .AsEnumerable() 
      .Select(t => t.Name); 

AsEnumerable() öğesinin kullanılması, projeksiyonun düzgün çalıştığı Linq-to-Objects bağlamında (bir OData sorgusu yerine) çalıştırılacak sorgunun son kısmını zorlar. Verilen cevaplar kullanma

+0

Teşekkürler, bu çalışır - AsEnumerable ile ilgili daha fazla bilgi buldum - http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/d427cbf6-4d8a-42ee-9799-d5ca79e581dc – Dal

+0

Keşke bunu işten test edebilseydim (Netflix burada bloke edildi) ama aslında ilk projeksiyon gerekli midir? Burada biraz fazlalık görünüyor. –

+0

@JeffMercado: Odata'ya göre (ve yukarıdaki yorumlardaki bağlantı), bir oda projeksiyonu kuruluşu kendisi gönderir, ancak gerekli olmayan özellikleri dışarıda bırakır - bu nedenle performansın en aza indirgenmesi, – BrokenGlass

0

, bazı testler yaptım ve çalıştırma süresi ile ilgili bazı ilginç şeyler bulduk:

// Avg Execution Time: 5 seconds 
var query1 = Titles 
      .Where(t => t.ReleaseYear == 2007) 
      .Select(t => new {t.Name});  
query1.Dump(); 


// Avg Execution Time: 15 seconds 
var query2 = Titles 
      .Where(t => t.ReleaseYear == 2007) 
      .AsEnumerable() 
      .Select(t => t.Name);  
query2.Dump(); 

Yani şu sorguda 1'de düşüncesinde Neredeyim, sadece 'Ad' mülkiyet iade ediliyor ? Sorgu 2'de, 'AsEnumerable()' yöntemi, varlığı tüm özellik değerleriyle geri getiriyor, dolayısıyla daha uzun yürütme süresi mi?

+0

Evet, aktarılan veriler, query2 için çok daha büyüktür VE siz, tüm varlıkları sorguladığınız için içerik tarafından değişiklik izlenir. – springy76