.NET F# SQLProvider - leftOuterJoin

.NET F# SQLProvider - leftOuterJoin
« kdy: Dnes v 16:56:24 »
Ahojte pouzivam v jednej F# appke SQLProvider

https://fsprojects.github.io/SQLProvider/

na pristup k DB. Funguje to krasne a mozem zapisovat dotazy priamo v jazyku F# co je fajn, lebo nemusim nic escapovat a mam to pekne v jednom jazyku (F#). Klasicky (inner) join sa robi takto:

Kód: [Vybrat]
query {
    for country in dc.Dbo.Countries do
    where country.IsEnabled
    join city in dc.Dbo.Cities on (country.Id = city.CountryId)
    sortBy country.Name
    thenBy city.Name
    select (country.Id, country.Name, city.Id, city.Name, city.IsCapital)
}

ale ako zapisat leftOuterJoin? LINQ pre F# normalne podporuje keyword leftOuterJoin, ale zda sa ze SQL Provider pre MS SQL ma s tymto zapisom problem. Skusal som toto:

Kód: [Vybrat]
query {
        for country in dc.Dbo.Countries do
        where country.IsEnabled
        leftOuterJoin city in dc.Dbo.Cities on (country.Id = city.CountryId) into cities'
        for city' in cities'.DefaultIfEmpty() do
        sortBy country.Name
        thenBy city'.Name
        select (country.Id, country.Name, city'.Id, city'.Name, city'.IsCapital)
}

A hadze mi to runtime error:

Kód: [Vybrat]
System.Exception: 'unrecognised method call value(FSharp.Data.Sql.Runtime.QueryImplementation+SqlQueryable`1[FSharp.Data.Sql.Common.SqlEntity]).GroupJoin(value(FSharp.Data.Sql.Runtime.QueryImplementation+SqlQueryable`1[FSharp.Data.Sql.Common.SqlEntity]), country => country.GetColumn("Id"), city => city.GetColumn("CountryId"), (country, cities') => new AnonymousObject`2(Item1 = country, Item2 = cities'.DefaultIfEmpty()))'
Ako sa teda zapisuje leftOuterJoin pre SQL Provider? Ci mam v DB spravit View a az na ten sa dotazovat? Ale nechce sa mi verit ze by SQL Provider leftOuterJoin a rightOuterJoin nepodporoval. Ved to je uplne zakladna vec pre kazdu DB.


Kit

  • *****
  • 874
    • Zobrazit profil
    • E-mail
Re:.NET F# SQLProvider - leftOuterJoin
« Odpověď #1 kdy: Dnes v 18:28:09 »
Používá se kombinace join ... into a DefaultIfEmpty().

Re:.NET F# SQLProvider - leftOuterJoin
« Odpověď #2 kdy: Dnes v 22:45:23 »
Používá se kombinace join ... into a DefaultIfEmpty().

Hej presne, ten druhy pripad. zial SQLProvider ho nepodporuje.

Ale uz som sa zbavil SQLProvidera nebudem pouzivat taketo obskurne knniznice. Boli s nim aj ine problemy. Napriklad ze connectionString cital z Web.config ktory uz ale nova verzia ASP.NET Core nahradila appstettings.json

Nakoniec som pouzil normalny EntityFrameworkCore, sice teraz tam mam este dalsi medzikrok a po zmenach v DB msim generovat entity ale aspon pouzivam dobre odtesovanu kniznicu a nie nejaky one man show.