2010-03-15 11 views
5

LINQ kullanırken (özellikle, LINQ-to-entities) MVC'yi uygulamak istiyorum. Bunu yapmam, Denetleyicinin LINQ kullanarak sonuç kümesini oluşturmasını (veya üreten bir şeyi çağırmasını), ardından verileri görüntülemek için View'a döndürmesini sağlamaktır.Anonim türleri döndürmek için basit bir yol (LINQ kullanarak MVC'yi oluşturmak için)

return (from o in myTable select o); 

Tüm sütunlar, veritabanından istemiyorum bile olanları (potansiyel olarak onlarca) okunmaktadır: Ben yaparsam sorun vardır. Ve - daha önemlisi - Böyle bir şey yapamaz yapabilirsiniz :

return (from o in myTable select new { o.column }); 

anonim türleri tip-güvenli hale getirmek için bir yolu yoktur çünkü! Eminim 3.5 (this temiz değil ...), bunu yapmak güzel, temiz bir yolu yoktur, ama 4.0 hakkında ne? Planlanmış, hatta teklif edilen bir şey var mı? gibi bir şey olmadan ördek yazarak-for-LINQ veya tip-güvenli anonim dönüş değerlerinin (o derleyici kesinlikle bu kapasitede olmalıdır bana öyle geliyor), temiz adlı Kontrolörü ayırmak neredeyse imkansız gibi görünüyor.

+0

Bir orm ile çalışırken, sql'in bir tablonun tüm sütunlarını seçmesi düşüncesine alışmanız gerekir. Sadece birkaçını seçen sorgular yazarsanız, ilk etapta sql'yi de kullanabilirsiniz. Nesnelerinizde düzinelerce mülkünüz varsa, o zaman probleminiz budur. Nesneleriniz daha küçük olmalı ve bunu nasıl düzeltebileceğinizi düşünmelisiniz. Anonim tipler, özellikle bir görünüm için model olarak değil, etrafından geçirilmemelidir. –

+0

@Mattias: Maalesef hayat çok kolay değil. Örneğin, bir iç LINQ sorgusu kullanılarak seçilen bir nesne dizisi dahil olmak üzere, farklı tablolardan birkaç sütun seçtiğim durumu düşünün. Bildiğim kadarıyla, bunu tek bir EF nesnesi olarak geri döndürmenin bir yolu yoktur - yeni bir tip olması * ve bu tür her sorgu için yeni bir beton türü tanımlamak gülünç bir şekilde hantaldır. –

+0

Bana oldukça kötü bir modelin olduğu gibi geliyor. Nesnenin ihtiyacı olan referanslara sahip olması gerekir ve EF'de "Include()" yöntemini (bu verileri hevesle yüklemek için) kullanabilirsiniz. Verileri farklı tablolarda farklı sütunlar olarak düşünmekten vazgeçerseniz ve modeliniz hakkında daha fazla bilgi (daha fazla OO) ile çalışmak daha kolay olacaktır. Alt satır: Anonim tiplerin etrafından geçme ihtiyacı duyuyorsanız, büyük olasılıkla yanlış bir şey yapıyorsunuz demektir. Yansıma tabanlı bir senaryo haricinde –

cevap

1

, kendim cevap verecektir ..

Bu çıkıyor, C# 4.0 ördek yazmaya destekler - onlar dynamic typing diyoruz.

  • Derleme zamanı tür denetimi
  • Performans
  • IntelliSense

Ben açtım: Ancak, anonim türlerini döndürmek için dinamik türlerini kullanarak, güçlü türleri faydalarını kaybetmek Bu C# 5 için yararlı bir katkı olacaktır düşünüyorsanız, bağlantıyı takip ve Net ekibine bildirin - özellik isteği kesinlikle yazılan anonim dönüş türleri here olması!

3

Anonim tipler öncelikle bir yöntem içinde kullanılmak üzere tasarlanmıştır. Yöntemler arasında iletişim için uygun değildirler.

iki fonksiyon arasında en iyi yolu veri kümesi geçmek gerekirse

+0

, bunlar için bir çift iyi kullanım vardır (örneğin MVC framework html yardımcılarında) –

+0

@Jared: LINQ ile hariç, bu hiç de doğru değil - LINQ nesneleri kesinlikle etrafta geçmeniz gerekiyor, ancak dil sınırlamalarından dolayı C# yapamazsınız. Ancak, * VB.net'de yapılabilir. –

+0

@BlueRaja, üzgünüm bu yanlış. Onlar ** her iki dilde 'System.Object' olarak çevrilebilirler. Anonim türler iyi anonim olduğu için her iki dilde güçlü bir şekilde geçemezler. Meta verilerde görünecek herhangi bir yerde doğrudan tanımlanamazlar. VB.net (ve C# 4.0) 'da bunları, zayıf yazılan bir şekilde erişerek çalışabilirsiniz, ancak OP'nin sorduğu şey bu değildir. – JaredPar

4

bir görünüm modeli katmanı kullanın Tuple<T1,T2> gibi ya KeyValuePair<TKey,TValue> gruplandırma bir kaybeden verilerini sarma yeni bir tür oluşturmak veya kullanmaktır. Görüşünüzün ne göstereceğini bilmek zorundasınız. Çok boyutlu bir veri dizisini biçimlendiren bir görünüm oluşturmanın mümkün olduğunu tahmin ediyorum, ancak bu bir MVC çözümü ile gitmek için tam olarak en iyi neden değil. Ancak görünümünüzde tüketim için anonim bir nesneyle bir görünüm modelini doldurabilirsiniz. kimse bile soruma cevap çalıştı beri

2

Bu nasıl?

I (haydi 'MyTableEntity' diyelim) 'myTable' Eğer tablo için bir varlık sınıfı olduğunu varsayalım, bu nedenle yeni bir MyTableEntity nesnesini başlatın ve nesne başlatıcı kullanmayın neden istiyorsun sadece bu sütunları doldurmak için?

return (from o in myTable select new MyTableEntity { AColumn = o.column }); 

istediğin gibi Bu * bir SEÇ çevirmek olmaz, ancak hala bir görünüme özellikle yazılan nesneye geçmek için bir yol olacak. Sadece görünümü içinde başlatıldı özelliklerin faydalanmak için

Sen dikkatli olmak zorunda ve bu kadar.

Bu sizin için anlamlı mıdır?

+0

Bu iyi bir fikir - Bir şans elde ettiğimde (birkaç günlüğüne değil) işte deneyeceğim –

0

.NET 4.0 üzerinde Anonim tipler kolayca ExpandoObjects'a dönüştürülebilir ve bu nedenle tüm sorunlar dönüştürmenin baş üstü ile sabitlenir. here

0

göz atın kolaylıkla dinamik nesneler haline anonim türlerini dönüştürebilir, burada Anonim nesne veya DataReader doldurabilirsiniz Donymous nesneler (Dinamik anonim nesneler) basit bir uygulamasıdır.

İlgili konular