【问题标题】:Passing parameter to LINQ query将参数传递给 LINQ 查询
【发布时间】:2014-08-23 08:36:49
【问题描述】:

我有一个方法如下:

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 :(
}

当我运行代码时,我得到了分配给 userId 的默认值 0,这意味着找不到 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")}

解决办法是什么?

【问题讨论】:

  • 你能显示调用GetUserIdByCode的代码吗?
  • 我怀疑该值不是实际上 LRAZAK - 我怀疑它在开头或结尾有空格,或类似的东西。
  • 数据库中的u.Code是什么类型?
  • 您应该尝试清理输入以确保userCode 字符串中没有任何奇怪的东西。
  • 你检查过长度是6吗?考虑非打印字符...

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


【解决方案1】:

作为一种解决方法,我使用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 的对象,其中Code 和Id 作为属性。这是在我的一个类中定义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    相关资源
    最近更新 更多