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.

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top