Linq function like .Net string.CompareOrdinal

只谈情不闲聊 提交于 2019-12-01 05:37:18

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!