2

我有一个名为 UserInfo 的类,其中包含有关给定用户的详细信息。

代码中有几个地方可能会查询数据,我希望有一个函数来用来自 Linq 查询的相应数据填充 UserInfo 对象。

                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;
                    ...

                }

如何正确设置函数以接受此匿名类型作为参数?我需要声明一个新接口还是有更简单的方法?

谢谢您的帮助!

PS-对于过多的下划线感到抱歉,嵌套类使事情变得有些混乱。

4

2 回答 2

2

恐怕不可能将匿名类型作为参数传递给另一个方法。但我想知道为什么您首先使用匿名类型而不与用户合作?

PS:顺便说一句,如果您在整个代码中应用相同的模式,为什么不为 UserInfo 实现一个具体的类?

于 2009-09-13T04:15:49.297 回答
2

为简单起见,您不能让所有例程都接受实体对象本身吗?例如,如果dc.Users是类型表UserEntity,则跳过Select()

UserEntity userData = dc.Users.Where(
       λ => (λ.Login == username) && λ.Active).SingleOrDefault();

如果这是不可接受的,请封装一个更有限的对象,它将 UserEntity 作为 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();

这将混乱的转换从应用程序的其余部分抽象出来。但是,一般而言,我建议您简单地使用实体对象,因为它可以在您需要时更轻松地进行反向操作(将修改后的实体传递回 DAL)。

于 2009-09-13T04:32:00.717 回答