NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
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
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í
+2,50 Kč
Ř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: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
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.