【问题标题】:LINQ to Entities .contains is ignoring results with NULLLINQ to Entities .contains 忽略 NULL 的结果
【发布时间】:2012-11-10 19:58:40
【问题描述】:

我是 Entity Framework 的新手,正在努力解决我希望是一个基本问题。我的代码在这里:

    Dim accounts As List(Of STUDENT) =
        (From a In SA.STUDENTs
         Where (a.MATRIC_NO.Contains(matric) And a.FIRST_NAME.Contains(firstName) And a.MIDDLE_NAMES.Contains(middleName) And a.SURNAME.Contains(lastName) And a.PREFERRED_NAME.Contains(preferredName))
         Select a).ToList

查询运行良好,直到数据库中的搜索字段之一为 NULL。例如,如果在 seach 界面中输入了一个矩阵数字,但中间名留空,则如果中间名在数据库中为 NULL,则查询将不会返回任何记录。如果中间名是数据库中的一个空格,那么它将返回记录。

谁能指点一下?

非常感谢!

【问题讨论】:

  • 但是 NULL 不包含任何内容,对吧?
  • 如果输入查询的值不为空,则查询应返回匹配记录。如果输入的值为空白,那么它应该返回任何记录,即使该值为 NULL。这有意义吗?

标签: vb.net linq entity-framework


【解决方案1】:

您可以在查询中添加额外的检查。例如:

public function filterList(IEnumerable list, string name)
{
    var filtered_list = list.Where(x=> x.Name.Contains(name) || string.IsNullorWhitespace(name)).ToList();

    return filtered_list;
}

所以你可以看到,如果name变量为空,所有元素都会返回true,所以所有元素都会返回(没有应用真正的过滤器)。

所以基本上,您可以更改所有过滤器

something.Contains(anotherthing)

something.Contains(anotherthing) || string.IsnullOrWhitespace(anotherthing)

【讨论】:

  • 我总是忘记 IsNullorWhitespace 的正确大小写,对此感到抱歉。
  • IsNullOrWhitespace 在 SQL Server 中实现了吗?
  • 感谢您的回复。虽然努力让它工作,但运行时错误是 LINQ to Entities 无法识别 IsNullOrWhitespace。
  • 我不确定这是否能完成我需要它做的事情。我需要发生的是,如果用户在其中一个条件中输入一个值,那么查询应该返回所有匹配的记录,即使正在搜索的其他字段之一是 NULL。
  • 如果您有一个过滤器处于活动状态(假设您在 LastName 列中查找“smith”),则不应显示 LastName 列中带有 NULL 的行,因为它们不包含搜索到的字符串。但是,如果您对 LastName 的过滤器是 null/string.Empty,则应显示所有行,包括在 lastname 列中具有 NULL 的行。但是你不能在 NULL 上调用 .Contains() 函数(根据定义,它不是字符串)。
【解决方案2】:
(From a In SA.STUDENTs
         Where isnull(a.MATRIC_NO.Contains(matric) And a.FIRST_NAME.Contains(firstName) And a.MIDDLE_NAMES.Contains(middleName) And a.SURNAME.Contains(lastName) And a.PREFERRED_NAME.Contains(preferredName))
         Select a).ToList

像这样 `:select * from tbl where statusid = isnull(@statusid,statusid)

【讨论】:

  • 感谢您的回复。不过,我是用 VB 而不是 C# 编写的!我会试着把它翻译成 VB 并检查一下。
  • Dim accounts As List(Of STUDENT) = (From a In SA.STUDENTs Where (a.matric == null || a.MATRIC_NO.Contains(matric) a.FIRST_NAME == null || a.FIRST_NAME.Contains(firstName) 和 a.MIDDLE_NAMES.Contains(middleName) 和 a.SURNAME.Contains(lastName) 和 a.PREFERRED_NAME.Contains(preferredName)) 选择 a).ToList
  • 这仍然是 C#。我知道这是一个查询,但不幸的是,当我尝试输入时它被踢出。
【解决方案3】:

像这样尝试..

   Dim get_rmf_2 = From rmf In t_rmf _
          Where Not IsDBNull(rmf!NIVP) AndAlso rmf!NIVP = nivp_rap

这是在VB中我认为这很好用

【讨论】:

  • 嗯,代码有效但实体框架无法识别 IsDBNull。它会导致运行时错误。我会继续加油的!
【解决方案4】:

我设法使用不同的方法解决了这个问题。如果没有为特定字段输入值,请将其排除在查询之外。我使用谓词完成了这一点,如下所示:

    'create the base query
    Dim accounts =
        (From a In SA.STUDENTs
         Select a)


    'create predicates for each condition required in the query
    If matric <> "" Then
        accounts = accounts.Where(Function(m) m.MATRIC_NO.Contains(matric))
    End If

    If firstName <> "" Then
        accounts = accounts.Where(Function(f) f.FIRST_NAME.Contains(firstName))
    End If

    If middleName <> "" Then
        accounts = accounts.Where(Function(mn) mn.MIDDLE_NAMES.Contains(middleName))
    End If

    If lastName <> "" Then
        accounts = accounts.Where(Function(l) l.SURNAME.Contains(lastName))
    End If

    If preferredName <> "" Then
        accounts = accounts.Where(Function(p) p.PREFERRED_NAME.Contains(preferredName))
    End If

    'execute the query
    Dim accountlist = accounts.ToList

    'return the results
    Return accountlist

如果有人发现这有什么问题,或者我不知道有什么问题,请告诉我!我对 LINQ to Entities 和一般的 LINQ 非常陌生!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多