2011-03-28 20 views
7

Bunun ile ilgili bir sorunla karşılaştım, ancak birkaç örnek alıyorum. Lambda olmayan yöntemi kullanarak mükemmel bir anlam ifade eder, ancak lambda ifadelerini kullanarak nasıl bir araya gelirim?Linq to SQL lambda üye ol

var myCats = GetAllCats(); 
var myHouses = GetAllHouses(); 

// pseudosql: select * from a inner join b on a.id = b.id 

Bunu denedim: ben tür SO diğer örneklere bakarak içeri girdi, ancak fullData IEnumerable<Cat> yüzden o uzakta Houses herhangi özelliklerini çekemez tipidir

var fullData = myCats.Join(myHouses, a => a.id, b => b.id, (a, b) => a); 

.

cevap

28
var fullData = myCats.Join(
       myHouses, 
       cat => cat.id, 
       house => house.id, 
       (cat, house) => 
        new 
        { 
        Cat = cat, 
        House = house 
        }); 

Erişim fullData.First().Cat... veya fullData.First().House... yoluyla. var

+0

Awesome thanks! – NibblyPig

+6

"foo" ve "bar" dan daha fazla bağlam içeren değişkenler kullandığınız için teşekkür ederiz. –

+0

lambda parametrelerini de değiştirdi, bu yüzden daha okunabilir. – Femaref

5

son argüman (a, b) => a yani o (cat, house) => cat

Sen mesela çifti ile geçici bir nesne döndürebilir var, sadece kedilere dönüş sonucunu harita anlamına gelir çünkü

(cat, house) => new { cat, house } 
6

problem, sonucu sizin katılmak - Üyelik yöntemin son parametre - fullData tip IEnumerable<Cat> taşımaktadır, bu yüzden bir Cat olduğunu. Her iki erişmek istiyorsanız, bir anonim tür dönmek:

var fullData = myCats.Join(myHouses, a => a.id, 
            b => b.id, 
            (a, b) => new { Cat = a, House = b}); 
5

Sen onlardan seçmek istediğiniz sadece ne olduğunu tanımlamak gerekir.

değiştirebilirsiniz senin ikincisi için:

class anonymous 
{ 
    Cat cat, 
    House house 
} 

LINQy formatında eşdeğerdir:

from cat in myCats join house in myHouses 
    on cat.id equals house.id 
    select new {cat, house} 

var fullData = myCats.Join(myHouses, cat => cat.id, house => house.id, (cat, house) => new {cat, house}) 

fullData yapacak gibi görünüyor anonim türünde bir IQueryable

Ayrıca, atmayı önlemek için ne seçmek istediğinizi de belirtebilirsiniz:

from cat in myCats join house in myHouses 
    on cat.id equals house.id 
    select new {cat.id, cat.name, house.address}