我想要做的是找到给定Id的角色Name的第一个或默认值。
这是我试过的LINQ:
var roleId = await db.AspNetRoles
.Select(r => r.Id)
.Where(r => r.)
.FirstOrDefault();
这是我的班级:
我在Entity Framework Asp.Net Identity中有这个类
public AspNetRole()
{
this.AspNetUsers = new List<AspNetUser>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<AspNetUser> AspNetUsers { get; set; }
当我看到r之后我有什么选择。我发现我不能输入像r.Name
这样的名字有人能告诉我我做错了吗?
答案 0 :(得分:4)
因为Select
将源投影到新映射上,在这种情况下只包含int Id
。从那里开始,您将使用IEnumerable<int>
,但没有Name
属性。
您可以使用:
.Select(r => new { r.Id, r.Name })
投影到仅包含Id
和Name
。
或者您可以先查询,然后进行项目:
await db.AspNetRoles
.Where(r => r.Id == someId)
.Select(r => r.Name)
.FirstOrDefault();
或者完全省略投影(.Select()
调用),但这完全取决于你想对结果做些什么。
答案 1 :(得分:1)
您必须将执行顺序更改为
var roleId = await db.AspNetRoles
.Where(r => r.Name = "your Name")
.Select(r => r.Id)
.FirstOrDefault();
您的代码中的问题是,您Select
Id
类型为int
。然后,当您致电Where
时,您会看到ints
列表。如果您交换where
和select
,则首先过滤AspNetRoles
,然后select
过滤。
答案 2 :(得分:1)
试试这个: -
var roleId = await db.AspNetRoles
.Where(r => r.Id == YourId)
.Select(x => x.Name)
.FirstOrDefault();
或(如果你确定你有那个ID): -
var roleId = await db.AspNetRoles.FirstOrDefault(x => x.Id == YourId).Name;
但是,请注意,如果没有id匹配,它将抛出Null Reference Exception
。)
答案 3 :(得分:1)
你的问题很有道理:)。问题是你在过滤前正在预测。在选择之后,您将获得一组int。你需要做的是像这样颠倒查询:
var roleId = await db.AspNetRoles
.Where(r => r.Name=%smething%)
.Select(r => r.Id)
.FirstOrDefault();
我希望这会有所帮助:)
答案 4 :(得分:0)
只需更改顺序:
var roleId = await db.AspNetRoles
.Where(r => r.Id == 24)
.Select(s => s.Name)
.FirstOrDefault():
答案 5 :(得分:0)
在select中选择r.Id,结果只包含Ids。你也可以这样做:
var role = await db.AspNetRoles.FirstOrDefault(r => r.Name == "Some name");
if (role != null)
{
// more code about role.Id
}