Это продолжение этого вопроса о пользовательской подкачке в ASP.NET.
Скажем, у меня определена таблица:
CREATE TABLE Person
(
ID int identity(1,1) not null primary key,
FirstName varchar(50),
LastName varchar(50)
)
И он сопоставлен с классом через конструктор Linq to SQL. Я определил это свойство в классе Person
:
public string Name
{
get
{
if (FirstName != null && FirstName != "" && LastName != null && LastName != "")
return String.Format("{0} {1}", FirstName, LastName);
else if (FirstName == null || FirstName == "")
return LastName;
else if (LastName == null || LastName == "")
return FirstName;
else
return "";
}
}
Скажем, у меня есть сетка, которая сортируется по столбцу, связанному с этим свойством Name, и я хочу сделать пейджинг. Естественный способ сделать это с помощью Linq to SQL - это что-то вроде:
MyDBContext db = new MyDBContext();
var myData = db.Persons.OrderBy(p => p.Name).Skip(pageSize * pageIndex).Take(pageSize);
myGrid.DataSource = myData;
myGrid.DataBind();
Linq to SQL выдает здесь ошибку, потому что не может преобразовать свойство Name в SQL . Я могу поместить .AsEnumerable()
в строку фильтров, как отмечено в ответе на вопрос, на который я только что ссылался, но это означает, что я перетаскиваю все строки на веб-сервер и сортирую их там, что не идеально, если их достаточно записи в таблице. Фильтрация и сортировка должны происходить в базе данных.
Простой ответ - преобразовать это свойство Name
в SQL и сделать его частью SPROC, который возвращает данные, или представление, или что-то еще. Но мне это не подходит, потому что я помещаю логику отображения в слой своей базы данных. Еще хуже, если ситуация будет более сложной, чем мой несколько надуманный пример, и определенное свойство будет более нетривиальным.
Есть ли выход, или я застрял в необходимости выбора между производительностью и разделением интересов? Или мое беспокойство по поводу такого рода логики отображения в базе данных необоснованно?