2010-12-01 19 views
5

Burada gerekli olan veri türleri hakkında tamamen kafa karıştırıcı. Linq ObjectQuery Dönüştürün IEnumerable IQueryable

Bu Linq deyimi vardır: Bu gerekli verileri döndürür

   var feat = AllCustomers 
        .Select(c => c.CustomerServices.SelectMany(cs => cs.CustomerServiceFeatures) 
        .SelectMany(csf => csf.ConfigElements).Where(ce => ce.Name == "ItemType").Select(ce => ce.Value).Distinct()); 

ve aynı VS tipi ayarlanırken söylüyor:

System.Data.Objects.ObjectQuery<System.Collections.Generic.IEnumerable<string>> 

Ancak bu verileri eklemek istediğiniz bir dize listesidir:

List<string> itemTypes = new List<string>(); 
itemTypes.AddRange(feat); 

Ama bu bir hata atar:

Argument 1: cannot convert from 'System.Linq.IQueryable<System.Collections.Generic.IEnumerable<string>>' to 'System.Collections.Generic.IEnumerable<string>' 

Türü düzeltmek için gerekli sözdizimini bulamıyorum. Biri yardım edebilir mi?

Alkış, Matt

cevap

8

Derleme zamanı hatası gösterileri Bu feat "dize toplama topluluğudur" (kelimenin tam anlamıyla "IQunable of string dizisi"). Yani düz koleksiyon oluşturmanız gerekiyor.

feat.SelectMany(x => x) 
+1

Cevap, bana bütün zaman boyunca bana doğru bakıyordu, bunun yanında SelectMany() hilelerinin her türünü deniyordum. Ayrıca .. bu cevap Google için çok zordu! –

0

Eğer liste ile yapmanız gerekenler bağlı

List<string> list = feat.ToList<string>() 
+0

Seni reddetmedim ama bu işe yaramıyor. Koleksiyonu düzleştirmek için SelectMany() öğesine ihtiyacınız vardır. – Rap

0

kullanabilirsiniz tıpkı senin yapabilirsiniz:

var itemTypes = feat.ToList(); 
1

System.Data.Objects.ObjectQuery<T>System.Linq.IQueryable<T> bir uygulamasıdır. Bununla birlikte, yazımınız IEnumerable nesnelerin IQueryable'idir. SelectMany yapın, böylece artık dize koleksiyonlarından oluşan bir koleksiyonunuz yok, ancak sadece bir dizi koleksiyon var.