Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: SQL dotaz vs. Linq

Aktivity
Avatar
Michal Štěpánek:18.4.2016 9:31

Ahoj, mám takovýto SQL dotaz

SELECT Linky.LinkaId, Budovy.BudovaNazev, Linky.HS, Linky.Linka, Linky.Funkce, Linky.Jmeno, Linky.UctoHS, Linky.NS FROM Linky INNER JOIN Budovy ON Budovy.BudovaId = Linky.BudovaId ORDER BY Budovy.BudovaNazev, Linky.Linka

chtěl bych ho pro potřeby ASP.NET MVC projektu převést na Linq. Použil jsem Linqer konvertor a vylezlo z toho toto:

from Linky in db.Linky
                        join Budovy in db.Budovy on new { BudovaId = Convert.ToInt32(Linky.BudovaId) } equals new { BudovaId = Budovy.BudovaId }
                        orderby
                          Budovy.BudovaNazev,
                          Linky.Linka
                        select new
                        {
                            Linky.LinkaId,
                            Budovy.BudovaNazev,
                            Linky.HS,
                            Linky.Linka,
                            Linky.Funkce,
                            Linky.Jmeno,
                            Linky.UctoHS,
                            Linky.NS
                        }

ovšem při pokusu o zobrazení mi to spadne s chybou,

LINQ to Entities does not recognize the method 'Int32 ToInt32(Int32)' method, and this method cannot be translated into a store expression.

Mohl by mi, prosím, někdo poradit, jak toto mám vyřešit?

Odpovědět
18.4.2016 9:31
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
JOF
Tvůrce
Avatar
Odpovídá na Michal Štěpánek
JOF:18.4.2016 11:05

Ahoj,
podle mne by mohlo v klauzuli join stačit

join Budovy in db.Budovy on Linky.BudovaId equals Budovy.BudovaId

tedy pokud jsou Id stejného datového typu ...

Editováno 18.4.2016 11:08
 
Nahoru Odpovědět
18.4.2016 11:05
Avatar
Odpovídá na JOF
Michal Štěpánek:18.4.2016 12:16

Vypadá to, že by to tak mohlo fungovat, ale teď mi pro změnu vyskočí hláška

Položka modelu předaná do slovníku je typu System.Collec­tions.Generic­.List1[<>f__AnonymousType58[System.Int32,Sys­tem.String,Sys­tem.String,Sys­tem.Int32,Sys­tem.String,Sys­tem.String,Sys­tem.String,Sys­tem.Nullable1[System.Int32]]], tento slovník ale požaduje položku modelu typu System.Collections.Generic.IEnumerable1[MVCTelefony­.Models.Linky].

V podstatě mám tabulku "Linky", kde je sloupec "BudovaId" a chtěl bych ve View zobrazit místo ID budovy její název (z tabulky Budovy), jenže něco dělám špatně. Do modelu jsem si přidal novou položku

public string BudName { get; set; }

a myslel jsem si, že to takto půjde zobrazit..., ale evidentně nejde

Nahoru Odpovědět
18.4.2016 12:16
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Michal Štěpánek
vajkuba1234:18.4.2016 12:32

Snazis se to nacpat do dropdownlistu nebo jen tak vypsat?

Nahoru Odpovědět
18.4.2016 12:32
No hope, no future, JUST WAR!
Avatar
JOF
Tvůrce
Avatar
Odpovídá na Michal Štěpánek
JOF:18.4.2016 12:52

To je tím, že na konci toho LINQ dotazu vytváříš v části Select anonymní třídu.
Pokud chceš pouze zobrazit název budovy místo Id a máš tyto tabulky v relaci (což bys mít měl), pak bys také měl mít u typu Linka virtuální vlastnost typu Budova a tedy by stačilo vypsat linka.Budova.Bu­dovaNazev.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
18.4.2016 12:52
Avatar
Odpovídá na JOF
Michal Štěpánek:18.4.2016 13:08

Tabulky v relaci nemám, protože jsem to nikdy před tím nepotřeboval. To ale není problém zařídit.
Jen nějak nechápu to

mít u typu Linka virtuální vlastnost typu Budova

jak to mám udělat?

Nahoru Odpovědět
18.4.2016 13:08
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Michal Štěpánek
vajkuba1234:18.4.2016 13:14

V modelu Budova si udelej navigacni property public virtual Linka Linka {get;set;}, v modelu Linka zase udelej kolekci budov public virtual ICollection<Budova> Budovy {get;set;}. Bud ten FK muzes udelat pres data anotace a nebo pres fluent api.

http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx
Nahoru Odpovědět
18.4.2016 13:14
No hope, no future, JUST WAR!
Avatar
JOF
Tvůrce
Avatar
Odpovídá na vajkuba1234
JOF:18.4.2016 13:18

Řekl bych, ze by ta relace měla být obráceně. V modelu Budova mít kolekci linek a v modelu Linka jednu budovu...

 
Nahoru Odpovědět
18.4.2016 13:18
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na JOF
vajkuba1234:18.4.2016 13:21

Mas pravdu, moc jsem u toho nepremyslel. :)

Nahoru Odpovědět
18.4.2016 13:21
No hope, no future, JUST WAR!
Avatar
Odpovídá na JOF
Michal Štěpánek:18.4.2016 13:28

Až se skoro stydím, jak to bylo jednoduché. Když jsem si v DB udělal relaci mezi tabulkami Linky a Budovy, vytvořil jsem si znovu model (tam se automaticky přidala ta virtuální vlastnost) a controller a views si to všechno vygenerovalo samo... Díky.
P.S. Dříve jsem relace nedělal, protože jsem tvořil v ASP.NET WebForms a tam jsem používal klasické SQL dotazy a ne EF. Ale řekl jsem si, že se už konečně musím vnořit do MVC a pochopit to fungování EF. Ještě jednou díky za tvé rady...

Editováno 18.4.2016 13:30
Nahoru Odpovědět
18.4.2016 13:28
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.