无法将Lambda表达式转换为委托类型。

5
我正在尝试使用Entity模型从SQL数据库中获取第一个用户,该数据库已经存在,要查找的用户具有userID。出现了两个错误。
无法将lambda表达式转换为委托类型System.Func,因为块中的一些返回类型不能隐式转换为委托返回类型。
无法将类型int隐式转换为bool。
public user GetUser(int userID)
{
     using (var context = new iomniEntities())
    {
        user u = context.users.FirstOrDefault(user => user.userID);

        return u;
    }
}

context.users.ToList() 的功能正常,但我不想那么低效。


3
这里不需要使用ToList(这不会改变后续Enumerable调用所需的类型)。这个错误是编译时类型错误。看一下带有“红色波浪线”的表达式/行。特别是,user => user.userID并不返回布尔值,这就是错误试图表达的意思。(在某些EF场景中不使用ToList可能会导致运行时错误,这与编译时类型错误不同:它无法修复此问题。) - user2246674
7个回答

7
当使用表达式:user u = context.users.FirstOrDefault(user => user.userID);时,返回类型是userID(由Lambda表达式的第二部分确定),而不是声明user u所期望的'user'类型。
因此,如果您想返回一个userID为'userID'的单个user,请使用:
user u = context.users.FirstOrDefault(user => user.userID==userID);

或者您也可以使用:

user u = context.users
         .Where(user => user.UserId==UserID)
         .Select(user => user).Single();

同时确保你有以下的 Using 语句:using System.Linq;

".Select(x => x)" 是一个无用的术语,总是可以省略。 - Jarvis

1

我认为你的语法有点问题。尝试一下:

public user GetUser(int intUserID)
{
     using (var context = new iomniEntities())
    {
        user u = context.users.Where(u => u.userID == intUserID).FirstOrDefault();

        return u;
    }
}

或者保留你的版本,只需要修改一下:

public user GetUser(int intUserID)
{
     using (var context = new iomniEntities())
    {
        user u = context.users.FirstOrDefault(user => user.userID == intUserID);

        return u;
    }
}

.Where(f).FirstOrDefault().FirstOrDefault(f)应该会产生相同的查询结果。无论如何,这两种形式类型相同,所以影响其中一种的类型问题(与f有关)也会影响另一种。 - user2246674
@user2246674 жҳҜзҡ„гҖӮжҲ‘й”ҷиҝҮдәҶ.Where()е’Ң.FirstOrDefault()дёӯFunc<TSource, Boolean>зҡ„йғЁеҲҶ...е·Ізј–иҫ‘гҖӮ - ethorn10

1

你的 FirstOrDefault 方法中的表达式不正确 - 它需要返回一个bool的表达式,而你给它的是user => user.userID,它返回一个int

只需重写它以考虑传递的参数:user => user.userID == userID

话虽如此,如果不存在两个具有相同ID的用户,则最好使用context.Users.SingleOrDefault(user => user.userID == userID)


0

你的lambda表达式有误,它需要返回一个boolean类型,而你的只返回了.userID

你需要使用某种比较方式,例如:

user => user.userID == 10

FirstOrDefault返回与lambda表达式匹配的第一个或默认项(在你的情况下为null)。它不会返回列表中的第一项,这可能是你想要的。如果不知道上下文中的Users数据类型,我无法告诉你更好的方法。

你可以使用以下代码:

user => user != null


0
检查 'user' 类的属性是否声明为 public。
像这样:
public class user
{
    [Key]
    public int id { get; set; }
    public string name { get; set; }
    public string password { get; set; }

}

0

像其他人提到的那样,您需要稍微调整一下代码才能进行比较。 无论如何,我会使用Single/SingleOrDefault,因为您希望获取与提供的用户ID匹配的单个用户。

user u = context.users.SingleOrDefault(u => u.userID == userID);

或者只需执行返回

return context.users.SingleOrDefault(u => u.userID == userID);

-1

你需要根据“UserId”过滤用户,然后选择第一个。因此查询应该像这样:

User user = context.Users.Where(x=>x.UserId == UserId).FirstOrDefualt();

1
所有现有的答案都说了这个。你的回答有什么附加价值? - Gert Arnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接