これは、 ASP.NETのカスタムページングに関するこの質問のフォローアップです。
テーブルが定義されているとします。
CREATE TABLE Person
(
ID int identity(1,1) not null primary key,
FirstName varchar(50),
LastName varchar(50)
)
そして、LinqtoSQLデザイナを介してクラスにマップしました。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()
参照した質問への回答に記載されているように、フィルターの文字列を入力できますが、これは、すべての行をWebサーバーにプルしてそこで並べ替えることを意味します。これは、十分なレコードがある場合は理想的ではありません。テーブル。フィルタリングと並べ替えはデータベースで行う必要があります。
簡単な答えは、そのName
プロパティをSQLに変換し、データやビューなどを返すSPROCの一部にすることです。しかし、データベースレイヤーに表示ロジックを配置しているので、それは私には正しく感じられません。状況が私のやや不自然な例よりも複雑で、定義されたプロパティがより重要である場合は、さらに悪化します。
解決策はありますか、それともパフォーマンスと関心の分離のどちらかを選択する必要がありますか?それとも、データベース内のその種の表示ロジックに関する私の懸念は根拠がありませんか?