Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net LINQ to Entities.contains正在忽略带有NULL的结果_Vb.net_Linq_Entity Framework - Fatal编程技术网

Vb.net LINQ to Entities.contains正在忽略带有NULL的结果

Vb.net LINQ to Entities.contains正在忽略带有NULL的结果,vb.net,linq,entity-framework,Vb.net,Linq,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(last

我是实体框架的新手,我希望这是一个基本问题。我的代码在这里:

    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
查询运行正常,直到数据库中的一个搜索字段为空。例如,如果在搜索界面中输入了一个矩阵号,但中间名为空,则如果数据库中的中间名为空,查询将不会返回任何记录。如果中间名在数据库中是一个空格,那么它将返回记录

有人能提供一些建议吗


非常感谢

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

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)

像这样“:从tbl中选择*其中statusid=isnull(@statusid,statusid)

像这样尝试

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

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

我用另一种方法解决了这个问题。如果没有为特定字段输入值,则将其保留在查询中。我使用谓词实现了这一点,如下所示:

    '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
创建基本查询 模糊账户= (来自南非学生协会) 选择一个选项(a) '为查询中所需的每个条件创建谓词 如果矩阵为“”,则 accounts=accounts.其中(函数(m)m.MATRIC_NO.包含(MATRIC)) 如果结束 如果名字是“”,那么 accounts=accounts.Where(函数(f)f.FIRST_NAME.Contains(firstName)) 如果结束 如果名称为“”,则 accounts=accounts.Where(函数(mn)mn.MIDDLE_name.Contains(middleName)) 如果结束 如果姓氏为“”,则 accounts=accounts.Where(函数(l)l.namite.Contains(lastName)) 如果结束 如果首选名称为“”,则 accounts=accounts.Where(函数(p)p.preferredName.Contains(preferredName)) 如果结束 '执行查询 Dim accountlist=accounts.ToList "返回结果" 返回帐户列表
如果有人发现这有什么问题,或者有什么我不知道的问题,请告诉我!我对LINQ对实体和LINQ一般来说都很陌生

我总是忘记IsNullorWhitespace的正确大小写,对此很抱歉。
IsNullorWhitespace
是在SQL Server中实现的吗?谢谢您的回复。但为了让它正常工作,运行时的错误是LINQ to Entities无法识别IsNullOrWhitespace。我不确定这是否能完成我需要它完成的任务。我需要做的是,如果用户在其中一个条件中输入一个值,那么查询应该返回所有匹配的记录,即使正在搜索的其他字段之一为空。如果您有一个过滤器处于活动状态(假设您正在LastName列中查找“smith”),LastName列中的
NULL
行不应显示,因为它们不包含搜索的字符串。但是,如果LastName上的筛选器为
null
/
string.Empty
,则应显示所有行,包括LastName列中具有
null
的行。但是不能对
NULL
(根据定义,它不是字符串)调用
.Contains()
函数。但是NULL不包含任何内容,对吗?如果输入到查询中的值不是空的,那么查询应该返回匹配的记录。如果输入的值为空,则应返回任何记录,即使在值为空的情况下也是如此。这有意义吗?谢谢你的回答。不过我是用VB而不是C写的!我将尝试将其翻译为VB并检查它。Dim accounts As List(Of STUDENT)=(来自SA.STUDENTs中的a,其中a.matric==null | | | a.matric | NO.Contains(matric)和a.FIRST | U NAME==null | | a.FIRST NAME.Contains(firstName)和a.MIDDLE | NAME.Contains(middleName)和a.Nastname.Contains(lastName)和a.PREFERRED |包含(preferredName))选择a).ToListThat仍然是C#虽然。我知道这是一个查询,但当我尝试输入它时,它不幸被踢出。嗯,代码是有效的,但实体框架无法识别IsDBNull。它会导致运行时错误。我将继续插入!
   Dim get_rmf_2 = From rmf In t_rmf _
          Where Not IsDBNull(rmf!NIVP) AndAlso rmf!NIVP = nivp_rap
    '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