我有以下代码:
var Attributes = db.Users.Where(u => u.UserId == PwRetreival.uId).Select(u => new { u.Name, u.UserId }).ToList();
user.Name = Attributes(SOMETHING?)
user.UserId = Attributes(SOMETHING?)
我不知道如何将所选属性写入我的模型变量。我想当我这样写它时,它不知道属性的类型吗?
答案 0 :(得分:1)
此行返回匿名对象列表:
var Attributes = db.Users
.Where(u => u.UserId == PwRetreival.uId).Select(u => new { u.Name, u.UserId }).ToList();
因此,您可以迭代列表或索引它:
user.Name = Atrributes[0].Name;
注意:由于您是按照其ID获取该项目,因此我会使用Single
或SingleOrDefault
而非Where
。请参阅下文了解更多信息。
使用Single
如果您希望返回单个项目,请不要使用Where
,而是使用Single
。然后你可以这样做:
user.Name = Attributes.Name;
使用SingleOrDefaut
如果您期望单个项目或没有项目,请使用SingleOrDefault
,但在使用之前检查该值:
if (Attributes != null)
{
user.Name = Attributes.Name;
}
还有First
,FirstOrDefault
,Last
和LastOrDefault
。
答案 1 :(得分:1)
由于类型为List
,您需要使用FirstOrDefault()
从列表中获取第一条记录(假设您的Where
子句有足够的条件来获取您的确切记录要)。
var Attributes = db.Users.Where(u => u.UserId == PwRetreival.uId).Select(u => new { u.Name, u.UserId }).ToList().FirstOrDefault();
if (Attributes != null)
{
user.Name = Attributes.Name;
user.UserId = Attributes.UserId;
}
答案 2 :(得分:0)
Attributes
现在是包含Name
和UserId
的匿名类型的列表。
user.Name = Attributes[0].Name
user.UserId = Attributes[0].UserId
...如果列表包含至少1个元素,将获取first
用户的名称和ID。
你也可以这样做:
foreach(var user in Attributes)
{
// var userName = user.Name;
// var userId = user.UserId;
}
...遍历所有用户。在这种情况下,您甚至不需要查询中的ToList()
方法;
但是,此查询似乎只返回一个用户。在这种情况下,您可以将查询更改为
var Attributes = db.Users.Where(u => u.UserId == PwRetreival.uId).Select(u => new { u.Name, u.UserId }).FirstOrDefault();
...现在Attributes
只有一个Name
和UserId
的对象,您可以像以下一样访问它:
user.Name = Attributes.Name
user.UserId = Attributes.UserId
正如@Chris所指出的,如果您可以假设您的查询将返回0或1个元素,则应使用SingleOrDefault()
。如果它只返回1个元素,则应使用Single()
。如果结果包含的元素多于引发异常的元素。当你使用XOrDefault
时,你应该总是在之后检查null。