Avatar
Michal Štěpánek:

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. dubna 9:31
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
JOF
Tým ITnetwork
Avatar
Odpovídá na Michal Štěpánek
JOF:

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. dubna 11:08
 
Nahoru Odpovědět 18. dubna 11:05
Avatar
Odpovídá na JOF
Michal Štěpánek:

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. dubna 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:

Snazis se to nacpat do dropdownlistu nebo jen tak vypsat?

Nahoru Odpovědět 18. dubna 12:32
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
JOF
Tým ITnetwork
Avatar
Odpovídá na Michal Štěpánek
JOF:

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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 18. dubna 12:52
Avatar
Odpovídá na JOF
Michal Štěpánek:

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. dubna 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:

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. dubna 13:14
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
JOF
Tým ITnetwork
Avatar
Odpovídá na vajkuba1234
JOF:

Ř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  +1 18. dubna 13:18
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na JOF
vajkuba1234:

Mas pravdu, moc jsem u toho nepremyslel. :)

Nahoru Odpovědět 18. dubna 13:21
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Odpovídá na JOF
Michal Štěpánek:

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. dubna 13:30
Nahoru Odpovědět  +1 18. dubna 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.