Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: fortran1986 22. 09. 2025, 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:
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:
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:
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.
-
Používá se kombinace join ... into a DefaultIfEmpty().
-
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 musim generovat entity, ale aspon pouzivam dobre odtesovanu kniznicu a nie nejaky one man show.