2011-01-10 20 views
9

soru hemen hemen her şeyi söylüyor.FLinq kullanarak F # kümesine nasıl katılınır?

for alias1 in table1 do 
    for alias2 in table2 do 
     if alias1.Id = alias2.foreignId 

bu formu kullanarak, bu iki tablo arasında birleştirme Bir sol dış nasıl yapabilirim: Ben aşağıdaki biçimde bir büyük flinq sorgu var?

cevap

5

Query modülünde kullanılabilen groupJoin işlevini kullanabilirsiniz. Burada yabancı anahtarla tablo olarak birincil masa ve Kategoriler olarak Ürünleri ile Northwind kullanarak bir örnek:

open System.Linq 

<@ Query.groupJoin 
    db.Products db.Categories 
    (fun p -> p.CategoryID.Value) 
    (fun c -> c.CategoryID) 
    (fun p cats -> 
     // Here we get a sequence of all categories (which may be empty) 
     let cat = cats.FirstOrDefault() 
     // 'cat' will be either a Category or 'null' value 
     p.ProductName, if cat = null then "(none)" else cat.CategoryName) @> 
|> query 

Orada seq { .. } sözdizimi kullanarak bu ifade güzel yolu kesinlikle ve katılmak benzeri davranışları uygulayarak iç içe for kullanarak döngüler. Maalesef, LINQ çevirmenine yapılan alıntılar muhtemelen bunları desteklemeyecektir. (Kişisel olarak, boş toplama olup olmadığını kontrol etmek için for'u kullanarak ve if'u kullanarak kodu yazmayı tercih ederim).

Sadece F # takım için bir taahhüt çalışmanın bir parçası olarak PowerPack kitaplığında bazı iyileştirmeler bakıyordu, bu yüzden bu umarım gelecekte artıracak ... (ama söz!)

+0

Ancak buradaki verimi nasıl kullanabilirim? Ben 'groupJoin' işlevi bu desteklediğini sanmıyorum tüm – Cynede

+0

kısmındaki "(yok)" dönmek istemiyorum, ama her zaman' ekleyebilir |> Seq.filter' 'null' değere sahip tüm öğeleri düşmesi . –

0

Belki de sen sol dış birleştirmeyi gerçekleştiren veritabanında ve bu görünümde LINQ'da bir görünüm oluşturun. Her bir dış birleştirme ve belli noktalarda dış sorgu Resultset döngü zaman bu çağrı için

0

I oluşturulmuş ayrı sorgular sona erdi.