将列表中的属性写入var

时间:2017-03-11 13:56:54

标签: c# linq

我有以下代码:

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?)

我不知道如何将所选属性写入我的模型变量。我想当我这样写它时,它不知道属性的类型吗?

3 个答案:

答案 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获取该项目,因此我会使用SingleSingleOrDefault而非Where。请参阅下文了解更多信息。

使用Single

如果您希望返回单个项目,请不要使用Where,而是使用Single。然后你可以这样做:

user.Name = Attributes.Name;

使用SingleOrDefaut

如果您期望单个项目或没有项目,请使用SingleOrDefault,但在使用之前检查该值:

if (Attributes != null)
{
    user.Name = Attributes.Name;
}

还有FirstFirstOrDefaultLastLastOrDefault

答案 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现在是包含NameUserId的匿名类型的列表。

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只有一个NameUserId的对象,您可以像以下一样访问它:

user.Name = Attributes.Name
user.UserId = Attributes.UserId

正如@Chris所指出的,如果您可以假设您的查询将返回0或1个元素,则应使用SingleOrDefault()。如果它只返回1个元素,则应使用Single()。如果结果包含的元素多于引发异常的元素。当你使用XOrDefault时,你应该总是在之后检查null。