比较实体框架中的字符串编号范围



长话短说,我需要根据范围(高/低值(获取项目,但是数据库中的列/属性是string,我不允许更改它。那么我应该如何比较一个范围呢?

我似乎找不到将实体属性转换为int以便进行比较的方法。当然Convert.toInt32也行不通。我没有看到任何有帮助SqlFunctions,但也许我忽略了一些容易的事情。

我一直在玩它,但到目前为止没有运气。这是我最新的尝试,但不起作用:

var result = Repo.Query().Where(e => e.SerialNumber.Cast<int>().First() >= myIntLowVariable && e.SerialNumber.Cast<int>().First() <= myIntHighVariable);

有什么建议吗?

更新

用户输入两个序列号,我需要返回该范围内的所有记录,但是SerialNumberstring/varchar列/属性。

数据 - 对不起,不知道如何在这里放一个表格。.

SN :: 描述
1 :: 牛奶
2 ::鸡蛋
3 :: 面包
4 :: 奶酪
5 :: 培根
6 :: 酸奶
7 :: 芥
末8 :: 鸡肉
9 :: 披萨
10 :: 芯片

如果在查询上调用 ToList((,那么应该能够将字符串强制转换为 Int32。

var result = Repo.Query().ToList().Where(e => e.StringNumberField.Cast<int>().First() >= myIntLowVariable && e.StringNumberField.Cast<int>().First() <= myIntHighVariable);

如果无法投影整个查询,则可以执行以下操作:

在数据库中创建一个执行筛选的存储过程。像这样的事情可以:

CREATE PROCEDURE spGetStuffBetween
(
    @min int,
    @max int
)
AS
BEGIN
    SELECT * from dbo.Stuff where Convert(int, SerialNumber) < @max and  Convert(int, SerialNumber) > @min;
END
使用

EDM 工具使用新添加的存储过程从数据库更新模型。在"添加"下,选择刚创建的存储过程,然后选择"完成"。

更新模型后,您将无法看到存储过程,因此右键单击设计图面并选择"模型浏览器"。您将能够在"存储过程"节点下看到它。

"模型浏览器"中双击存储过程。您可以在此处指定从存储过程返回的集合类型。

现在,您可以调用以下代码来获取所需的结果:

int myIntLowVariable = 1000;
int myIntHighVariable = 1000000;
var results= Repo.spGetAnimalsBetweenRange(myIntLowVariable , myIntHighVariable );

使用此处的答案将字符串与前导零右对齐,并对输入字符串执行相同的操作,现在您可以对所需范围进行字母比较。

您也可以尝试此问题中的方法。

最新更新