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

时间:2013-07-23 00:14:17

标签: sql visual-studio-2010 linq entity-framework

我正在尝试使用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()工作正常,但我不想效率低下

7 个答案:

答案 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();