Функция Linq to Entities для возврата, находится ли целочисленный параметр в определенном диапазоне

У меня есть набор из 5 параметров, два верхних предела и два нижних предела диапазона и фактическое значение. В моем запросе Linq-to-Entites я хотел бы иметь возможность возвращать целое число в зависимости от того, где значение попадает в пределы диапазона.

Например:

if (value > highest limit || value < lowest limit) return 6;
if (value < highest limit && value > 2nd high limit || value > lowest limit && value < 2nd lowest limit) return 5;
else if (value < 2nd highest limit && value > 2nd lowest limit) return 4;

запрос будет:

var list = from item in ObjectContext.Plants
           where item.ID == ID
           select new Model()
           {
               ID = item.ID,
               Name = item.Name,
               Status = CalculateWhereInRange(item.numericValue, item.UpperHighLimit, item.LowerHighLimit, item.UpperLowLimit, item.LowerLowLimit)
           };
return list;

ИЗМЕНИТЬ

Запрос вызывается на стороне сервера и передает данные обратно в модель представления. Можно ли этого добиться с помощью хранимой функции или функции sql?


person xhedgepigx    schedule 12.11.2012    source источник
comment
Так в чем вопрос?   -  person tukaef    schedule 12.11.2012
comment
Также ваш запрос не будет работать, потому что поставщик запросов linq-to-entities не знает, как перевести CalculateWhereInRange   -  person tukaef    schedule 12.11.2012
comment
Это мой вопрос - как я могу это сделать? Сохраненная функция? Функция Sql в моей БД? Я не могу представить, как этого можно добиться с помощью доступных инструментов.   -  person xhedgepigx    schedule 12.11.2012
comment
Аналогичная проблема и решение: stackoverflow.com/q/13332986/1009661   -  person tukaef    schedule 12.11.2012


Ответы (2)


Добавьте метод GetRangeStatus в класс самого элемента. Тогда вы можете использовать его так

var list = from item in ObjectContext.Plants
           where item.ID == ID
           select new Model()
           {
               ID = item.ID,
               Name = item.Name,
               Status = item.GetRangeStatus() // <====
           };
return list;

Нет необходимости передавать какие-либо параметры, так как все необходимые значения хранятся вitem.

person Olivier Jacot-Descombes    schedule 12.11.2012
comment
Может быть, если это частичный класс? В противном случае вы можете сделать его методом расширения. - person Olivier Jacot-Descombes; 12.11.2012

Сохраните пять параметров:

    item.numericValue, item.UpperHighLimit, item.LowerHighLimit, item.UpperLowLimit, item.LowerLowLimit

В пяти свойствах вашего класса Model в конструкторе модели вы можете применить логику CalculateWhereInRange().

Нравиться

    var list = from item in ObjectContext.Plants
    where item.ID == ID
    select new Model()
       {
           ID = item.ID,
           Name = item.Name,
           NumericValue = item.numericValue, 
           UpperHighLimit = item.UpperHighLimit
           LowerHighLimit = item.LowerHighLimit
           UpperLowLimit =  item.UpperLowLimit
           LowerLowLimit = item.LowerLowLimit
       };



     public class Model()
     {
           public int UpperHighLimit {get;set;} //And all the others
           public Model()
           {
              //Do Calculations here with your 5 properties
           }
     }
person Mikey Mouse    schedule 12.11.2012
comment
Я хочу получить значения до того, как верну данные в модель представления (все это будет происходить на стороне сервера домена, а не на стороне клиента) - person xhedgepigx; 12.11.2012
comment
Ах я вижу. Если я правильно помню, вы можете использовать (if x)? y : z логика внутри вашего назначения статуса Linq2Sql, но это было бы действительно уродливо - person Mikey Mouse; 12.11.2012
comment
Да, я вижу, как было бы очень неряшливо пытаться держаться подальше от этого! - person xhedgepigx; 12.11.2012
comment
@xhedgepigx Да, решение для анонимных типов, на которое ссылается 2kay, выглядит так, как будто это то, что вы ищете. - person Mikey Mouse; 12.11.2012