9 messaggi dal 08 luglio 2004
Salve, è il mio primo post inoltre sono anche alle prime armi con linq 2 sql.
Ho un problema, vorrei filtrare i dati ritornati da un DataContext a seconda del ruolo che si propone. Di default linq 2 sql mi propone quanto segue:

public partial class dcAnfaDataContext
{
public System.Data.Linq.Table<hrs> hrs
{
get
{
return this.GetTable<hrs>();
}
}
}

ho effetutato alcune modifiche...

public partial class dcAnfaDataContext
{
public System.Data.Linq.Table<hrs> hrs
{
get
{
try
{
// recupero il ruolo
String[] Role = Roles.GetRolesForUser();
if (Role.Length > 0)
{
Boolean IsResponsabile = false;
foreach (String eRole in Role)
{
// se è amministratore ritorna tutte le righe
if (eRole.ToLower()=="amministratore") return this.GetTable<hrs>();
// controlla se ha il ruolo di responsabile altrimenti è addetto
if ((eRole.ToLower() == "responsabile") && (!IsResponsabile)) IsResponsabile = true;
}

MembershipUser MU = Membership.GetUser();
Table<hrs> table = this.GetTable<hrs>();
// estraggo i dati linkati tra la mia tabella utenti e la membership
var selHrs = (from p in table where p.UserId==(Guid)MU.ProviderUserKey select p).Single();

var selRows = from p in table where p.idhr==selHrs.idhr select p ;
// a questo punto avviene l'errore:
// se è un responsabile vorrei ritornare un subset di
// righe se è un addetto soltanto la sua riga.
// table.Where(LE => LE.idcompany == selHrs.idcompany) è di tipo
// IQueryable mentre invece il metodo deve ritornare un tipo
// Table<hrs>. In fase di runtime mi compare l'errore
// Impossibile eseguire il cast di oggetti di tipo
// 'System.Data.Linq.DataQuery`1[AI.Global.BizCore.hrs]' sul
// tipo 'System.Data.Linq.Table`1[AI.Global.BizCore.hrs]'
if (IsResponsabile) return (Table<hrs>)table.Where(LE => LE.idcompany == selHrs.idcompany);
//
else return (Table<hrs>)selRows;
}
}
catch (Exception ex)
{
throw ex;
}
}
}

Ringrazio chiunque mi possa dare una mano.
Antonio
Ciao,

da quello che ho capito non devi intercettare il ruolo se nella tabella hrs "gestisci" UserId (uniqueIdentifier) preso da Membership.

Probabilmente risolti tutto con una vista ed un metodo al quale passi il Guid.

P.S: Primo post, benvenuto !

Fabrizio Canevali
9 messaggi dal 08 luglio 2004
Grazie fabrica, effettivamente potrei usare una stored procedure passando la Guid ottenuta dalla membership, ma vorrei lasciare tutta la business logic nelle classi senza utilizzare stored procedure. La soluzione che stavo seguendo era quella di modificare il metodo presente nel datacontext che mi ritorna la tabella hrs. Sono arrivato al punto che non riesco a ritornate il tipo Table<T> perchè il subset di dati ritornato è di tipo IQueryable. Esiste qualche metodo della Table<T> che ritorna un Table<T> ? O comunque è possibile castare un IQueryable come Table<T> ?

Grazie
Antonio
io mi limiterei a restituire il tipo IQueryable<T> e non Table<T>, perche vuoi usare quest'ultimo?

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
9 messaggi dal 08 luglio 2004
Purtroppo, per compatibilità, ho bisogno ceh mi ritorni il tipo Table<hrs> e non un IQueryable...
Non trovo un post in tutti blog che da 3 giorni sto girando...
Grazie lo stesso
Antonio
non trovi nulla per un semplice motivo è Table<T> a implementare l'interfaccia IQueryable<T> e non viceversa, quindi non vedo proplemi di compatibilità, puoi consumare il tuo oggetto Table<T> attraverso un riferimento a IQueryable<T> e utilizzare sempre quest'ultimo

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
9 messaggi dal 08 luglio 2004
Ho provato a modificare la parte di codice sopra riportata, la compila anche, ma a runtime, quando effettua il databind con il gridview non trova il metodo Table<hrs> e và in errore.

Io dovrei trovare un modo per ritornare il tipo Table<hrs> da quanto segue:

if (IsResponsabile)
return (Table<hrs>)table.Where(LE => LE.idcompany == selHrs.idcompany);
else
return (Table<hrs>)(from p in table where p.UserId==(Guid)MU.ProviderUserKey select p).Single();

ovviamente in questo caso va in errore di casting...

Grazie di tutto nostromo.
Antonio

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.