c# - C# MVC 4 中带有 Linq 的 Where 子句

标签 c# entity-framework lambda

我正在尝试从我的 UserProfile 表 RoleID 中选择一个字段。传递给此 Post 方法的参数是用户名,它是一个来自文本框的字符串,可以正常工作。

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult GetRoles(string UserName)
    {
        if (!string.IsNullOrWhiteSpace(UserName))
        {
             string applyfor = db.Profiles
               .Select(s => s.RoleID)
               .Where(a=>Profile.UserName.Contains(UserName))
               .First();
             ViewBag.ApplyingFor = applyfor;

但是这给了我序列不包含任何元素。

我已经尝试了其他几种方法,例如 .Equals()。我很确定这是我的 where 子句。

我在这里做错了什么?

注意:RoleID不是Websecurity的一部分,数据库中也有数据。

最佳答案

如果您分解代码并突出显示每个 Lambda 语句返回的内容,您就会看到问题:

string applyfor = db.Profiles
                     ^^^^^^^^

这很可能返回类似于 DbSet<Profile> 的内容.

  .Select(s => s.RoleID)
   ^^^^^^

这很可能返回 IQueryable<int> .此时您已经丢失了配置文件的上下文,现在只有零个或多个 RoleID

所以你的 a在 where 语句中是一个 int值,你现在没有办法找到用户名,这个 where 语句从字面上看毫无意义。

  .Where(a=>Profile.UserName.Contains(UserName))

当您将 Lambda 表达式重新排列为 Grant Winney's Answer shows 时你可以看到为什么大部分时间都是 Select()是通常发生的最后一件事(在简单查询中)。

我敢打赌没有 UserNameProfile .你想要

string applyfor = db.Profiles
                    .Where(p => p.User.Any(u.UserName == UserName))
                    .Select(p => p.RoleID)
                    .First();

附带说明一下,Microsoft 最佳实践是 Camel-Case method parameters .所以我推荐你的方法如下:

public ActionResult GetRoles(string userName) // or username
{
}

关于c# - C# MVC 4 中带有 Linq 的 Where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22624864/

相关文章:

c# - 如何将参数添加到 WebRequest 中?

c#锁问题: lock(this) vs lock(SyncRoot)

c# - 从方法返回 <list> 值

Java 8 : Lambda expression contains more than one statement/logic

kotlin - 如何在kotlin中将lambdas与函数式接口(interface)一起使用并直接将lambda分配给var

c# - 用于查找包含整数数组中所有元素的所有对象的表达式

c# - asp 日历 0001/01/01

c# - 数据契约序列化不适用于所有元素

c# - EF CORE 无时间戳乐观并发

c# - EF反向POCO发生器单元测试