将LINQ结果传递给函数

时间:2009-09-13 04:08:25

标签: c# linq linq-to-sql anonymous-types

我有一个名为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-对于过多的下划线感到抱歉,嵌套类会使事情变得有些混乱。

2 个答案:

答案 0 :(得分:2)

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

PS:BTW如果你在代码中应用相同的模式,为什么不为UserInfo实现具体的类?

答案 1 :(得分:2)

为简单起见,你不能只让所有例程接受实体对象本身吗?例如。如果dc.UsersUserEntity类型的表格,请跳过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)。