繁体   English   中英

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

[英]Compare string number range in Entity Framework

长话短说,我需要得到基于一个范围(高/低值)项目,但是从数据库中列/属性是一个string而我不能改变这种状况。 那么我该如何比较一个范围呢?

我似乎无法找到将实体属性转换为int因此我可以进行比较。 当然Convert.toInt32也不起作用。 我没有看到任何SqlFunctions ,但也许我忽视了一些简单的事情。

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

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

有什么建议么?

更新

用户输入两个SerialNumbers,我需要返回该范围内的所有记录,但SerialNumber是一个string/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);

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

在您执行过滤的db中创建存储过程。 这样的事情会做:

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工具使用新添加的存储过程从数据库更新模型。 在“添加”下,选择刚刚创建的存储过程,然后选择“完成”。

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

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

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

int myIntLowVariable = 1000;
int myIntHighVariable = 1000000;

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

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

您也可以尝试这个问题的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM