Query parametriche con LINQ to Entities

venerdì 30 novembre 2012 - 17.24
Tag Elenco Tags  C#  |  .NET 4.0

Gemini Profilo | Expert

Ciao a tutti
sto realizzando un progetto con EF e nel riscrivere le vecchie query in LINQ to Entities è nato un problema: come faccio a riscrivere una query del genere?
string sql1 = string.Empty; if (par1 != string.Empty) sql1 = " AND par1='" + par1 + "' "; string sql2 = string.Empty; if (par2 != string.Empty) sql2 = " AND par2='" + par2 + "' "; string sql3 = string.Empty; if (par3 != string.Empty) sql3 = " AND par3='" + par3 + "' "; string sqlLimit = string.Empty; if (n > 0) sqlLimit = " LIMIT 0," + n); string sqlAscDesc = " DESC "; if (AscDesc != string.Empty) sqlAscDesc = " " + AscDesc + " "; string sqlOrderBy = "ORDER BY campo1 " + sqlAscDesc; if (orderby != string.Empty) sqlOrderBy = "ORDER BY " + orderby + sqlAscDesc; string sql = "SELECT * " + "FROM tabella " + "WHERE 1 " + sql1 + sql2 + sql3 + sqlOrderBy + sqlLimit;


Questo sia che scrivo così
var customers = from c in ctxCustomer
where ...

sia così
ctx.Customers.Where(...

Grazie mille

alx_81 Profilo | Guru

>Ciao a tutti
Ciao

vedi se ti aiuta la risposta a questo post, puoi fare dynamic where con linq:
http://stackoverflow.com/questions/533673/entity-framework-dynamic-where-clause

>Grazie mille
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

Gemini Profilo | Expert

Non ci ho capito molto :-)
Ci sono un pò di cose che mai ho utilizzato.
cmq, grazie

alx_81 Profilo | Guru

>Non ci ho capito molto :-)
>Ci sono un pò di cose che mai ho utilizzato.
da quanto ho capito puoi scrivere anche una stringa usando la lambda e questo ti dà decisamente libertà nella gestione della condizione di filtro, che non è poco. Poi con sintassi dichiarativa (from....) puoi fare delle if per generare le varie condizioni, ma diventa veramente pesante da gestire. Prova la soluzioni lamba, sembrano più comode.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

Gemini Profilo | Expert

grazie mille
ma è normale che mi è tutto poco chiaro dato che è la prima volta che utilizzo EF. Col passare del tempo mi sarà tutto più chiaro

alx_81 Profilo | Guru

>grazie mille
>ma è normale che mi è tutto poco chiaro dato che è la prima volta
>che utilizzo EF. Col passare del tempo mi sarà tutto più chiaro
tempo al tempo, tranquillo che col giusto interesse e con la voglia di fare, si arriva a grandi risultati!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

Gemini Profilo | Expert

Scusami Alessandro se ti disturbo ancora, ma la logica di EF non mi è ancora chiara.

ho trovato questa soluzione:
var query =
from u in ctx.aspnet_Users.ToList()
join m in ctx.aspnet_Membership.ToList() on u.UserId equals m.UserId
join up in ctx.UsersProfile.ToList() on u.UserId equals up.UserId
select new tipoUser
{
UserId = u.UserId.ToString(),
IsApproved = m.IsApproved,
Nome = up.Name,
Cognome = up.Surname,
CognomeNome = string.Concat(up.Surname, up.Name),
Username = u.UserName,
Password = m.Password,
Email = m.Email
};

if (status == "ON")
query.Where(m => m.IsApproved);
else if (status == "OFF")
query.Where(m => !m.IsApproved);

Ora ho un altro problema: vorrei selezionare tutti gli utenti che hanno un determinato RoleName.
Ti riporto la struttura delle tabelle aspnet_UsersInRoles e aspnet_Roles:
aspnet_UsersInRoles(UserId, RoleId)
aspnet_Roles(RoleId, RoleName, ...)

Il problema è che un utente non assume solo un ruolo e non voglio aggiungere altri join nella query. Stavo pensando di creare un Expression, ma non so proprio come fare una cosa del genere.
Grazie mille

alx_81 Profilo | Guru

>Il problema è che un utente non assume solo un ruolo e non voglio
>aggiungere altri join nella query. Stavo pensando di creare un
>Expression, ma non so proprio come fare una cosa del genere.
hai provato con una lambda sulla where? Hai una lista di utenti/ruoli sulla membership?
se sì, prova a fare .Where(m => m.RoleName = "tuonome").ToList()

così dovrebbe tornarti l'elenco degli utenti che fanno parte di quel ruolo, se non hai il nome, ricava l'id dalla roles e poi usa l'id nel codice sopra..
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

Gemini Profilo | Expert

Ciao Alessandro
a quanto ho capito se vado ad eseguire una lambda sul risultato della query posso far riferimento solo hai campi definiti in select.
In select ho definito tipoUser che ha una proprietà:
public List<string> Ruoli
{
get
{
List<string> ruoli = new List<string>();
ruoli.AddRange(Roles.GetRolesForUser(Username));

return ruoli;
}

set
{
ruoli = value;
}
}

Questa potrebbe una soluzione corretta? Di funzionare, funziona.
if (autorizzazione != string.Empty) query.Where(u => u.Ruoli.Contains(autorizzazione));

Grazie mille

alx_81 Profilo | Guru

>Questa potrebbe una soluzione corretta? Di funzionare, funziona.
>if (autorizzazione != string.Empty) query.Where(u => u.Ruoli.Contains(autorizzazione));
sembra di sì a prima vista
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5