将参数传递给LINQ查询

时间:2014-07-02 13:56:09

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

我有一个如下方法:

public void GetUserIdByCode(string userCode)
{
    var query = from u in db.Users
                     where u.Code == userCode // userCode = "LRAZAK"
                     select u.Id;

    var userId = query.FirstOrDefault(); // userId = 0 :(
}

当我运行代码时,我将默认值0分配给userId,这意味着找不到Id。 但是,如果我用下面的字符串更改了userCode,我将得到我想要的值。

public void GetUserIdByCode(string userCode)
{
    var query = from u in db.Users
                     where u.Code == "LRAZAK" // Hard-coded string into the query
                     select u.Id;

    var userId = query.FirstOrDefault(); // userId = 123 Happy days!!
}

我的问题是为什么将参数传递给LINQ查询不起作用? 当我进入代码时,我得到了如下的SQL语句:

// Does not work...
{SELECT "Extent1"."LOGONNO" AS "LOGONNO"FROM "DEBTORSLIVE"."DEBTORS_LOGONS" "Extent1"WHERE ("Extent1"."LOGONCODE" = :p__linq__0)}

硬编码的LINQ查询(工作的)提供如下SQL语句:

// Working just fine
{SELECT "Extent1"."LOGONNO" AS "LOGONNO"FROM "DEBTORSLIVE"."DEBTORS_LOGONS" "Extent1"WHERE ('LRAZAK' = "Extent1"."LOGONCODE")}

解决方案是什么?

2 个答案:

答案 0 :(得分:0)

作为解决方法,我使用Dynamic Linq。 下面的代码对我有用。

public void GetUserIdByCode(string userCode)
{
    string clause = String.Format("Code=\"{0}\"", userCode);

    var userId = db.Users
                        .Where(clause)
                        .Select(u => u.Id)
                        .FirstOrDefault();    
}

数据库查询返回User的对象,其中CodeId作为属性。这是在我的一个班级中定义的。

答案 1 :(得分:0)

public int GetUserIdByCode(string userCode)

{

int userId = (from u in db.Users
                 where u.Code == userCode
                 select u.Id).firstOrDefault();

}