Asp.net核心如何在linq语句中使用indexOf

时间:2017-05-19 14:29:59

标签: c# linq

我有以下linq声明:

var fliteredAddressLocations = addressLocations
    .Where(c => (c.StateId == companyStateID) && 
    (c.Suburb.IndexOf(query, StringComparison.OrdinalIgnoreCase) != -1)).ToList();

如果我删除"&&"之后的部分。并运行它 - 它可以返回大约3000个项目。

因为它返回0项。

我怀疑我写错了,并尝试了很多方法来构建它,包括发表几个单独的陈述。

它是一个搜索功能,用于搜索包含"查询"中字符的一组郊区。并且stateId为companyStateId。

你应该如何使用indexOf写这个,以便它返回子集?

3 个答案:

答案 0 :(得分:0)

我怀疑IndexOf没有正确地翻译成SQL。

您可以尝试使用Contains代替:

   var fliteredAddressLocations = addressLocations
        .Where(c => (c.StateId == companyStateID) && 
        (c.Suburb.Contains(query, StringComparison.OrdinalIgnoreCase)).ToList();

答案 1 :(得分:0)

在我使用SQL Server Compact DB和Linq2Sql(非EF)的实验中,此语句可以正常工作:

from p in Places
where p.Name.IndexOf("Ew") > -1
select p

返回Name为“New York”的行。如果我添加StringComparison.OrdinalIgnoreCase它失败(抛出异常),但是,至少在这种情况下,搜索是不区分大小写的,没有参数。

请注意,您也可以使用

from p in Places
where p.Name.Contains("Ew")
select p

具有相同的效果并且更清晰。

答案 2 :(得分:0)

我终于设法解决了如何在EF核心中使用内置SQL函数的问题,而这些功能并没有通过EF.Functions包含在EF中。

无需进一步说明,请将其放在您的Db上下文文件中:

[DbFunction("CHARINDEX", IsBuiltIn = true)]
public static long CHARINDEX(string substring, string string)
{
    throw new NotImplementedException();
}

并使用相同的模板导入其他任何SQL函数。

@edit: 如注释中所述,请密切注意类型。我的错误是使用了错误的字符串对象重载方法。我使用的是IndexOf( char 输入)而不是IndexOf( string 输入)。

建议您检查Functions mapping table以获得详细信息!