C#Linq字符串与indexOf

时间:2017-09-21 14:44:39

标签: c# entity-framework linq linq-to-entities

我有一个包含字符串字段的表,其中包含主机名。它们大多是完全合格的域名,但多年来第一个“点”之后的域位已经改变,因为各种DNS变化已经落在我们身上。所以我可能将表中的机器“tom”作为:

tom.company.com
tom.it.company.com
tom.newComapnyBranding.com
...

我经常要对“当前”主机名和这个历史商店进行比较。做类似的事情:

WHERE
    UPPER(SUBSTRING(@foo, 1, CHARINDEX(".", @foo))) = 
    UPPER(SUBSTRING(myDB.myTable.machineName, 1, CHARINDEX(".", myDB.myTable.machineName)))

好的,我正在尝试将其中一个转换为Linq查询,但我在“索引”部分遇到了绊脚石。我差不多了:

myTable.machineName.ToUpper().Substring(0, myTable.machineName.IndexOf("."))
    .Equals(foo.ToUpper().Substring(0, foo.IndexOf(".")))

但是visual studio正在抱怨“IndexOf”。它声称我需要将IndexOf更改为:

IndexOf(".", StringComparison.Ordinal))

但是当我运行它时,我收到了异常消息:

LINQ to Entities does not recognize the method 'Int32 IndexOf(System.String,
System.StringComparison)' method, and this method cannot be translated into
a store expression

你如何在Linq中使用这种基于索引的子字符串?

1 个答案:

答案 0 :(得分:9)

给予Entity Framework的表达式仅限于可以转换为SQL的表达式。 EF不知道如何将String.IndexOf翻译成SQL。

您可以使用SqlFunctions.CharIndex

SqlFunctions.CharIndex(machineName, ".")