问题
I need to compare strings using the string.CompareOrdinal(...)
inside a linq query.
string max;
string min;
var res = db.Table
.Where(c => string.CompareOrdinal(c.Id, min) >= 0)
.Where(c => string.CompareOrdinal(c.Id, max) <= 0)
.ToList();
The code throws a exception:
LINQ ti Entities does not recongnize the method 'Int32 CompareOrdinal(System.String, System.String)' method, and this method cannot be translated into a store expression.
There are a lot of data in the table, so I really need the where
clause.
Is there a way around this?
Update
I'm not trying to deside if two strings are equal - case sensitive or not.
I'm trying to deside whether a string is within a range. So the quistion is
- Is there a way to do that - so that is works with L2E?
Obviously, I cannot use the string.CompareOrdinal
回答1:
A colleague of mine found a workaround using string.Compare instead of string.CompareOrdinal
string min = "a";
string max = "z";
var res = db.Table
.Where(c => string.Compare(c.Id, min, StringComparison.OrdinalIgnoreCase) >= 0)
.Where(c => string.Compare(c.Id, max, StringComparison.OrdinalIgnoreCase) <= 0)
.ToList();
this is the generated SQL:
SELECT
[Extent1].[Id] AS [Id]
FROM [dbo].[Table] AS [Extent1]
WHERE ([Extent1].[Id] >= 'a') AND ([Extent1].[Id] <= 'z')
回答2:
If Id is a string, this solution works, so it looks like Id is an int. Int cannot be compared to a string. Change Id to a string or min/max to an int to make it work (and use a simple < and > between the int values).
By the way: it would save 1 iteration to check for min and max in 1 where function.
来源:https://stackoverflow.com/questions/15784340/linq-function-like-net-string-compareordinal