Letní akce! Lákají tě IT školení C#, Javy a PHP v Brně? Přihlas se a napiš nám do zpráv kód "BRNO 500" pro slevu 500 Kč na libovolný brněnský kurz. Lze kombinovat se slevami uvedenými u školení i použít pro více kurzů. Akce končí 28.7.

Diskuze: ASP. NET MVC vytáhnutí dat z DB

C# .NET .NET (C# a Visual Basic) ASP. NET MVC vytáhnutí dat z DB American English version English version

Aktivity (3)
Avatar
Adam Gajdečka:19.12.2017 21:52

Ahoj,
řeším problém a nemůžu najít řešení.

var invoiceConversions  = db.InvoiceConversions.Where(s => s.ProgramInvoiceId == id);

v této proměnné jsou modely, které obsahují několik vlastností. Id, Name, ConversionId ...

a nyní potřebuji dostat do následující proměnné

var conversions = db.Conversions. // všechny konverze podle Id a ty Id jsou v té první proměnné jako ConversionId

Jak to udělat? Vím, že to můžu udělat přes foreach, ale tím budu zatěžovat databázi. Potřebuji to vytáhnout najednou.

Jde o filtrování podle listu. Děkuji

Editováno 19.12.2017 21:53
 
Odpovědět 19.12.2017 21:52
Avatar
Lako
Člen
Avatar
Odpovídá na Adam Gajdečka
Lako:19.12.2017 23:29
var conversions = db.Conversions.Where(t => invoiceConversions.Contains(t.ConversionId));

Jestli jsem to teda dobře pochopil. Příště by nebylo špatné ukázat ten model...

Editováno 19.12.2017 23:29
 
Nahoru Odpovědět  +1 19.12.2017 23:29
Avatar
Adam Gajdečka:20.12.2017 15:56

Díky, ten tvůj kod funguje, jen jsem musel upravit ten můj první řádek.

IQueryable<int> conversionIds = db.InvoiceConversions.Where(s => s.ProgramInvoiceId == id).Select(s=>s.ConversionId);
             var conversions = db.Conversions.Where(t => conversionIds.Contains(t.Id));

             foreach (var conv in conversions)
             {
                 conv.StateId = 1;

                 db.Entry(conv).State = EntityState.Modified;

         }

         db.SaveChanges();

Nyní těm konverzím měním stav. Jen nevím, zda to vložení jde taky udělat jen jedním dotazem na DB. Nejsem si jistý zda to db.Entry vytěžuje DB nebo ne. Jde to prosím ještě nějak optimalizovat? díky

 
Nahoru Odpovědět 20.12.2017 15:56
Avatar
Lako
Člen
Avatar
Odpovídá na Adam Gajdečka
Lako:20.12.2017 16:52

No. Zjednodušit to jde takto:

IQueryable<int> conversionIds = db.InvoiceConversions.Where(s => s.ProgramInvoiceId == id).Select(s=>s.ConversionId);

db.Conversions.Where(t => conversionIds.Contains(t.Id)).ToList()..ForEach(s => s.StateId = 1);
db.SaveChanges();

To nastavení stavu na modify by se tam mělo udávat automaticky... Zjednodušení je to ale spíš syntaktické, kód který si napsal asi už nezrychlíš. Ten foreach tam prostě být musí...
Kdybys to chtěl ještě víc "zjednodušit" můžeš takto:

db.Conversions.Where(t => (db.InvoiceConversions.Where(s => s.ProgramInvoiceId == id).Select(s=>s.ConversionId)).Contains(t.Id)).ToList().ForEach(s => s.StateId = 1);
db.SaveChanges();

Ale to jsme to spíš "vyšpagetili" než zjednodušili...

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 20.12.2017 16:52
Avatar
Adam Gajdečka:20.12.2017 17:14

ok, díky

 
Nahoru Odpovědět 20.12.2017 17:14
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:20.12.2017 17:37

Hmm.. jak tak koukam, tak EF je stále pro většinu vývojářů nástroj hromadného ničení :-/

Přitom stačí přečíst 3 stránky textu a každému bude hned jasný rozdíl meti connected/dis­connected entitami, jak funguje change tracking atd.

http://www.entityframeworktutorial.net/…amework.aspx

  • následující 2 stránky po kliknutí na NEXT.
Nahoru Odpovědět  -1 20.12.2017 17:37
Totalitní admini..
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 6 zpráv z 6.