代码之家  ›  专栏  ›  技术社区  ›  Kelly Robins

将Linq结果传递给函数

  •  2
  • Kelly Robins  · 技术社区  · 17 年前

    我有一个名为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;
                        ...
    
                    }
    

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

    谢谢你的帮助!

    抱歉,过多的下划线,嵌套类使事情有点混乱。

    2 回复  |  直到 17 年前
        1
  •  2
  •   Rex M    17 年前

    为了简单起见,难道您不能让所有的例程都接受实体对象本身吗?例如如果 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)更容易进行反向操作。

        2
  •  2
  •   Beatles1692    17 年前

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

    附言:顺便说一句,如果在代码中应用相同的模式,为什么不为userinfo实现一个具体的类呢?