我有一个名为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-对于过多的下划线感到抱歉,嵌套类会使事情变得有些混乱。
答案 0 :(得分:2)
我担心将匿名类型作为参数传递给另一个方法是不可能的。 但我想知道你为什么使用匿名类型而不是首先与用户合作?
PS:BTW如果你在代码中应用相同的模式,为什么不为UserInfo实现具体的类?
答案 1 :(得分: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)。