2012-05-18 2 views
1

Короче говоря, мне нужно получить элементы на основе диапазона (высокое/низкое значение), однако значение свойства column из базы данных равно string, а мне не разрешено изменять что. Итак, как я должен сравнивать диапазон?Сравнить диапазон номеров строк в Entity Framework

Я не могу найти способ конвертировать свойство entity в 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 :: Chips

+0

Какая строка хранится в вашей базе данных? это фиксированный формат? некоторые примеры помогут получить лучший ответ. –

+0

можете ли вы разместить несколько примеров данных, пожалуйста, –

+0

. Какое максимальное количество цифр? Было бы возможно построить запрос, который смотрит на длину, и делает сравнение на основе каждой из 1, 2, 3, ... цифр? Или как насчет нулевого заполнения до фиксированной длины и сравнения строк? –

ответ

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); 
+0

Извините, я не могу проецировать все данные в память. Есть много способов записи. – MisterIsaak

+0

Обновлено решением с использованием хранимой процедуры и EF. –

+0

Спасибо за обновленный ответ, я закончил тем, что выбрал sproc, как вы предполагали. Поскольку бизнес-логика в основном представляет собой пакетное обновление, вероятно, лучше всего быть в sproc. – MisterIsaak

1

правого выравнивать строки с ведущими нулями, используя ответ here и сделать то же самое со своими входными строками, теперь вы можете сделать алфавитное сравнение для желаемого диапазона.

Вы также можете попробовать подход в this question.

+0

Мне понравился второй вариант ссылок, но я не смог заставить его работать. Я не собираюсь вникать в это больше, когда у меня есть время. Я понятия не имел, что существуют определенные функции. Благодаря! – MisterIsaak

Смежные вопросы