我正在尝试使用Entity model
从 SQL 数据库中抓取第一个用户,该数据库正在与已有的 userID 的数据库通信用户我正在寻找。出现这个和第二个错误。
无法将lambda表达式转换为委托类型
System.Func<iomnientitylibrary.user,bool>
因为有些人 块中的返回类型不能隐式转换为委托返回类型。
无法将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()
工作正常,但我不想效率低下。
答案 0 :(得分:5)
使用表达式时:user u = context.users.FirstOrDefault(user => user.userID);
返回类型是userID(这由Lambda表达式的第二部分确定)而不是类型:'user',语句根据声明期望:user u
因此,如果您想要返回其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 System.Linq;
答案 1 :(得分:1)
FirstOrDefault
方法中的表达式不正确 - 它需要一个返回bool
的表达式,并为其提供user => user.userID
,返回int
。
只需将其重写为您传入的参数的帐户:user => user.userID == userID
也就是说,如果没有2个用户使用相同的ID,那么context.Users.SingleOrDefault(user => user.userID == userID)
可能会更好。
答案 2 :(得分:0)
我认为你的语法略有不同。尝试:
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;
}
}
答案 3 :(得分:0)
您的 lambda 错误,需要返回boolean
,而您只需返回.userID
。
您需要使用某种比较,例如:
user => user.userID == 10
FirstOrDefault 返回与lambda表达式匹配的第一个或默认值(在您的情况下为null)。它不会返回列表中的第一个项目,这是我认为您想要的。不知道context.Users数据类型是什么,我不能告诉你更好的方法来做到这一点。
您可以使用以下内容:
user => user != null
答案 4 :(得分:0)
就像其他人提到的那样,您需要稍微调整代码以进行比较。 无论如何,我会使用Single / SingleOrDefault来做到这一点,因为您期望获得与提供的用户ID匹配的单个用户。
user u = context.users.SingleOrDefault(u => u.userID == userID);
或者只是返回
return context.users.SingleOrDefault(u => u.userID == userID);
答案 5 :(得分:0)
将“用户”类的检查属性声明为公共。
像这样
#include <iostream>
#include <utility>
//using namespace std; // <-- bad practice!
class Vector
{
private:
int *m_n;
public:
Vector(int x = 0);
Vector(const Vector &src);
Vector(Vector &&src);
~Vector();
Vector& operator=(const Vector &src);
Vector& operator=(Vector &&src);
// alternatively, both operators can be merged into one:
// Vector& operator=(Vector src);
// you should not give outside code directly access to the int* itself,
// that would promote bad practices, and potentially crash your class's
// internal code if outside code assigns a bad pointer.
//
// these accessors provide safer use of the *value* that the int* points
// at, let the class itself be the sole handler of the int* itself ...
int n() const;
void n(int x);
};
Vector::Vector(int x)
: m_n( new int(x) )
{
std::cout << "Converting Constructor called" << std::endl;
}
Vector::Vector(const Vector &src)
: m_n( new int(src.n()) )
{
std::cout << "Copy constructor called" << std::endl;
}
Vector::Vector(Vector &&src)
: m_n( src.m_n )
{
src.m_n = nullptr;
std::cout << "Move constructor called" << std::endl;
}
Vector::~Vector()
{
delete m_n;
std::cout << "Destructor called" << std::endl;
}
Vector& Vector::operator=(const Vector &src)
{
if (&src != this) {
*m_n = src.n();
}
std::cout << "Copy assignment called" << std::endl;
return *this;
}
Vector& Vector::operator=(Vector &&src)
{
Vector tmp(std::move(src));
std::swap(m_n, tmp.m_n);
std::cout << "Move assignment called" << std::endl;
return *this;
}
/* alternatively:
Vector& Vector::operator=(Vector src)
{
std::swap(m_n, src.m_n);
std::cout << "Assignment called" << std::endl;
return *this;
}
*/
int Vector::n() const
{
return *m_n;
}
void Vector::n(int x)
{
*m_n = x;
}
int main()
{
Vector v1(5);
Vector v2 = v1;
std::cout << "Vector v1 has n value: "<< v1.n() << std::endl;
std::cout << "Vector v2 has n value: "<< v2.n() << std::endl;
v1.n(499);
std::cout << "Vector v1 has n value: " << v1.n() << std::endl;
std::cout << "Vector v2 has n value: "<< v2.n() << std::endl;
return 0;
}
答案 6 :(得分:-1)
您必须根据“UserId”过滤用户,然后选择第一个用户。所以查询应该是这样的:
User user = context.Users.Where(x=>x.UserId == UserId).FirstOrDefualt();