Diskuze: entity framework - načtení části databáze.

C# .NET .NET (C# a Visual Basic) entity framework - načtení části databáze. American English version English version

Aktivity (1)
Avatar
natech
Člen
Avatar
natech:8.11.2016 8:45

Potřeboval bych vědět, jakým způsobem přistoupit k tomuto problému.
Mám např. DbContext se třemi tabulkami.
První tabulku připojuji na datagrid:

public partial class MainCl : Window
    {
ChimEntities database = new ChimEntities();

public MainCl()
{
database.table1.Load();
datagrid1,ItrmsSource = database.table1.Local;
}
}

Nenašel jsem jakoukoli možnost jak zajistit načítání jen části tabulky, např od nějakého datumu.

Úplně stejně je to s tabulkou 2:

private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
//toto nenačte nic
database.Entry((table1)e.AddedItems[0])
                .Collection(p => p.table2)
                .Query()
                .Where(p => p.seznam.Contains(slovo) || p.seznam.Contains(slovo2))
                .Load();

//toto způsobí načtení všech záznamů příslušných k vybranému řádku
//(tady mě napadá, že v prvním příkladu je možné vynechat řádek s funkcí Load())
            dataGridKontaktFirmy.ItemsSource = ((table1)e.AddedItems[0]).table2;
}

Jakým způsobem se dá v entity frameworku pracovat s načtením jen některých záznamů?

Děkuji za každou radu.

 
Odpovědět 8.11.2016 8:45
Avatar
Odpovídá na natech
Michal Štěpánek:8.11.2016 10:18

V té druhé ukázce používáš

.Where(p => p.seznam.Contains(slovo) || p.seznam.Contains(slovo2))

tak si tu podmínku uprav i pro datum...

Nahoru Odpovědět  +1 8.11.2016 10:18
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
natech
Člen
Avatar
Odpovídá na Michal Štěpánek
natech:8.11.2016 10:54

No právě že mi ta podmínka nenačte nic a pak při přiřazení do ItemsSource datagridu se načte komplet všechno.

 
Nahoru Odpovědět 8.11.2016 10:54
Avatar
Odpovídá na natech
Michal Štěpánek:8.11.2016 11:22

Pak jí máš asi nějak blbě napsanou. Já v EF nejsem zběhlej, používám ho pouze "z donucení" u webaplikací v ASP.NET MVC. U desktopových aplikací používám klasické SQL příkazy, ale i tak si myslím, že jinak než podmínkou se k požadovanému efektu nedostaneš.

Nahoru Odpovědět 8.11.2016 11:22
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
jozef_i
Člen
Avatar
jozef_i:8.11.2016 14:38

Malo by to ísť. Urobíš
datagrid1.Item­sSource = database.table1­.Where(p=>p.Da­tum>=datumOd)­.ToList();
Kde datumOd je dátum (DateTime premenná) od ktorého to chceš filtrovať...

 
Nahoru Odpovědět 8.11.2016 14:38
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:8.11.2016 17:22

Já nevím jak ostatní, ale já tady trošičku cítím problém s porovnáváním datumu :-) To by ti ale melo spadnout (mozna to odchytava treba te grid catchem).. Budes muset sahnout po DbFunctions.

Nahoru Odpovědět 8.11.2016 17:22
"C# 3.0 (2007) volal Java 8 (2014), že chce svoje featury zpět"
Avatar
natech
Člen
Avatar
natech:9.11.2016 13:56

Takže jeden problém byl v tom, že jsem měl povolené LazyLoading. Po vyřazení se nenačítají nechtěné záznamy

database.Configuration.LazyLoadingEnabled = false;

Druhý problém je, že nefungují podmínky Where(p => p.seznam.Conta­ins(slovo) || p.seznam.Conta­ins(slovo2))
V tabulce2 mám v seznam toto
"slovo1|slovo2|slo­vo3|" (případně atd.) a potřebuji načíst jen záznamy, které obsahují v seznamu dané slovo.
V DbFunctions jesm si nic nevybral.

 
Nahoru Odpovědět 9.11.2016 13:56
Avatar
natech
Člen
Avatar
natech:9.11.2016 14:51

Podmínky už fungují. Chyba byla jinde.

 
Nahoru Odpovědět 9.11.2016 14:51
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 8 zpráv z 8.