У меня есть сетка Telerik MVC, которую я настроил для пользовательского связывания с IQueryable, чтобы упростить сортировку вычисляемого столбца. Поведение сортировки по умолчанию, когда сетка сортируется по этому свойству, таково:
data = data.OrderBy(product => product.oneMthCost_IntOnly);
«data» - это IQueryable, product.oneMthCost_IntOnly не возвращается из базы данных, это вычисляемое свойство, которое вычисляется при вызове метода доступа «get» для этого свойства в «SearchViewModel»:
public class SearchViewModel
{
public int ID { get; set; }
public string lend_name { get; set; }
public decimal? pDes_rate { get; set; }
public string pDes_details { get; set; }
public int? pDes_totTerm { get; set; }
public decimal? pDes_APR { get; set; }
public string pDes_revDesc { get; set; }
public string pMax_desc { get; set; }
public DateTime? dDipNeeded { get; set; }
public DateTime? dAppNeeded { get; set; }
public decimal oneMthCost_IntOnly
{
get { return ProductOperations.CalculateSingleYearInterestCost(SourcingModel.search.LoanAmt, (decimal)pDes_rate); }
}
}
Чтобы объяснить, как возвращается SearchViewModel («данные»), она основана на модели данных сущностей, которая использует следующий отложенный запрос Linq в качестве основы для сетки, проецируемой в SearchViewModel.
//Return the required products
var model = from p in Product.Products
where p.archive == false && ((Prod_ID == 0) || (p.ID == Prod_ID))
select new SearchViewModel
{
ID = p.ID,
lend_name = p.Lender.lend_name,
pDes_rate = p.pDes_rate,
pDes_details = p.pDes_details,
pDes_totTerm = p.pDes_totTerm,
pDes_APR = p.pDes_APR,
pDes_revDesc = p.pDes_revDesc,
pMax_desc = p.pMax_desc,
dDipNeeded = p.dDipNeeded,
dAppNeeded = p.dAppNeeded
};
Используя поведение сетки по умолчанию, поэтому ниже:
data = data.OrderBy (product => product.CalculatedProp);
Выдает эту ошибку при сортировке этого столбца:
Указанный член типа 'oneMthCost_IntOnly' не поддерживается в
LINQ to Entities. Только инициализаторы, члены сущности и сущности
свойства навигации поддерживаются.
Что ж, это имеет смысл, дерево выражений не знает, каким будет это значение, пока оно не получит его с помощью метода доступа get. Итак, я полностью смирился с тем, что мне нужно будет материализовать весь набор объектов, выполнить вычисления для каждой строки, а затем отсортировать IQueryable по нему (к сожалению, бизнес-логика слишком сложна для дерева выражений, чтобы повернуть расчет в SQL, поэтому требуется метод C #). Поэтому я делаю следующее:
var calcdata = data.ToList().OrderBy(p => p.oneMthCost_IntOnly);
, которая материализует все данные, выполняет все вычисления и сортирует их в IOrderedEnumerable calcdata ... вот в чем проблема:
Как мне соединить "calcdata" с "data", чтобы отсортировать данные IQueryable по ключу IOrderedEnumerable "calcdata"? Перепривязка сетки к «calcdata» приводит к путанице при разбивке по страницам, однако, если вы предложите, что это лучший путь вперед, я тоже могу пойти по этому пути.
Извините, это немного затянуто, я просто хотел бы включить довольно много информации, чтобы дать вам наиболее полную картину.
Спасибо
Mark