2013-01-23 43 views
8

herhangi rekor olup olmadığını aşağıdaki LINQ varlıkları bu şemaLINQ (tarafından ve Kont)

Table P Table R Table Q 
PK* 
RK ----> RK* 
Text  QK ------> QK* 
      Text  Text 

karşı çalışır ve bu mesajı verir

from r in ctx.Rs 
join p in ctx.Ps on r.RK equals p.RK 
group r by r.QK into gr 
select new { QK = (int)gr.Key, Num = gr.Count() } 

sorgulamak var P'de karşılık gelen kayıt yokken Q: "Int32" türünde cast değeri, materialized değeri null olduğu için başarısız oldu. Sonuç türünün jenerik parametresi veya sorguda nullable bir tür kullanılmalıdır. "

Sorun, son satırdaki gr.Count() 'dir, ancak bir çözüm bulamıyorum. Gr için sıfır test etmeye çalıştım ama işe yarayan bir yol bulamıyor.

Benzer bir soruna Count() yerine Sum() kullanarak bir takım çözümler gördüm, ancak bunları benim sorunuma uyarlayamadım.

Sorguyu Group and Count in Linq issue'daki gibi görünmeye çalıştım, ancak başka bir ileti aldım.

Ayrıca Group and Count in Entity Framework (ve başkalarının sayısı) de baktım ama sorun farklı.

cevap

4

Biçimini okumada sorun yaşıyorum. Ama deneyebilirsiniz:

from r in ctx.Rs 
join p in ctx.Ps.DefaultIfEmpty() on r.RK equals p.RK 
group r by r.QK into gr 
select new { QK = (int)gr.Key, Num = gr.Count(x => x.RK != null) } 

DefaultIfEmpty ile ve x => x.RK != null değişiklikleri olmak.

+0

Yanıtladığınız için teşekkür ederiz. Ne yazık ki, bu hala aynı mesajı veriyor. –

13

grup Anahtarı boş

var results = ctx.Rs.Where(r => r.QK != null) 
    .GroupBy(r => r.QK) 
    .Select(gr => new { Key = (int)gr.Key, Count = gr.Count() } 
    .ToList(); 

PS olamaz.

  1. Çoğunlukla, Entity Framework'de 'JOIN' sözdizimine ihtiyacınız yoktur. bkz. Loading Related Entities

  2. Tanımlayıcı-anlamlı değişken isimleri yazmak kodlarınızı önemli ölçüde iyileştirir ve anlaşılır hale getirir. Gerçek dünya üretiminde okunabilirlik önemlidir.

+0

Aslında, aslında mükemmel değil. İyi çalışır, ancak yanlış cevap verir çünkü R'de olmayan Rs içerir. Bunu bir birleştirmeyle çözmeye çalıştığımda aynı mesajı alırım. P'de olmayan R'leri hariç tutmanın başka bir yolu var mı? Başka önerileriniz var mı? –

+0

Çözümünüzün işe yaramasını ve doğru sonucu vermesini sağladım. Anahtar, çözümünüzün ilk satırında '.Where (r => r.QK! = Null)' dir. Tekrar teşekkürler. –