1

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

我似乎找不到将实体属性转换为的方法,int因此我可以进行比较。当然Convert.toInt32也不行。我看不出有什么SqlFunctions帮助,但也许我忽略了一些简单的事情。

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

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

有什么建议么?

更新

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

数据- 抱歉不知道如何在这里放一张桌子..

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

4

2 回答 2

2

如果您在查询中调用 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 );
于 2012-05-18T00:11:01.943 回答
1

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

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

于 2012-05-18T02:46:50.820 回答