Passando i risultati LINQ a una funzione
-
06-07-2019 - |
Domanda
Ho una classe chiamata UserInfo che contiene dettagli su un determinato utente.
Esistono diversi punti nel codice in cui è possibile eseguire una query sui dati e vorrei avere un'unica funzione per riempire l'oggetto UserInfo con i dati corrispondenti della query Linq.
var userData = dc.Users.Where(λ => (λ.Login == username) && λ.Active)
.Select(λ => new { λ.ID, Salt = λ.Seasonings.Single().Salt, λ.Login, λ.PassHash, λ.Admin, λ.Trusted, λ.E_mail, λ.Name, λ.Phone, λ.Note, λ.RegistrationDate }).SingleOrDefault();
string tmppass = generatePassHash(password, userData.Salt);
if (userData.PassHash.Trim() == tmppass.Trim())
{
ID = userData.ID;
// Here is the stuff i'd like to move to a function
_user._id = userData.ID;
_user._userState = State.NotAuthorized;
_user._username = userData.Login;
_user._name = userData.Name;
_user._email = userData.E_mail;
_user._phone = userData.Phone;
_user._notes = userData.Note;
...
}
Come posso impostare correttamente una funzione per accettare questo tipo anonimo come argomento? Devo dichiarare una nuova interfaccia o esiste un modo più semplice?
Grazie per l'aiuto!
PS: scusami per gli eccessivi underscore, le classi nidificate rendono le cose un po 'confuse.
Soluzione
Per semplicità, non potresti semplicemente accettare che tutte le tue routine accettino l'oggetto entità stesso? Per esempio. se dc.Users
è una tabella di tipo UserEntity
, salta Select ()
:
UserEntity userData = dc.Users.Where(
λ => (λ.Login == username) && λ.Active).SingleOrDefault();
E se ciò non è accettabile, incapsulare un oggetto più limitato che utilizza UserEntity come parametro ctor:
public class UserInfo
{
public string Name {get;set;}
public string Phone {get;set;}
...
public UserInfo(UserEntity entity)
{
this.Name = entity.Name;
this.Phone = entity.Phone;
...
}
}
var userData = dc.Users.Where(
λ => (λ.Login == username) && λ.Active).Select(
λ => new UserInfo(λ)).SingleOrDefault();
In questo modo viene asportata la conversione disordinata dal resto dell'applicazione. Tuttavia, in generale consiglierei semplicemente di utilizzare l'oggetto entità, poiché rende molto più semplice andare al contrario quando è necessario (passando un'entità modificata al DAL).
Altri suggerimenti
Temo che non sia possibile passare un tipo anonimo come argomento a un altro metodo. Ma mi chiedo perché stai usando un tipo anonimo e non stai lavorando con l'utente in primo luogo?
PS: A proposito se stai applicando lo stesso modello attraverso il tuo codice perché non implementi una classe concreta per UserInfo?