如何限制LINQ查询?

时间:2014-11-24 12:46:38

标签: c# asp.net linq entity-framework

我想要做的是找到给定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

这样的名字

有人能告诉我我做错了吗?

6 个答案:

答案 0 :(得分:4)

因为Select将源投影到新映射上,在这种情况下只包含int Id。从那里开始,您将使用IEnumerable<int>,但没有Name属性。

您可以使用:

.Select(r => new { r.Id, r.Name })

投影到仅包含IdName

的匿名对象

或者您可以先查询,然后进行项目:

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列表。如果您交换whereselect,则首先过滤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
}