私が取り組んでいるWebアプリケーションの一部は、管理者から1人のユーザーまでのメッセージを表示する領域です。 LINQ to SQLクラスを含むDataAccessプロジェクトと、UIであるWebサイトプロジェクトがあります。私のデータベースには、次のようになります。ベストプラクティスre:LINQ To SQL for data access
ユーザー - > MessageDetail < - メッセージ< - MessageCategory
MessageDetailもIsReadフラグが含まれている結合テーブルです。
メッセージのリストはカテゴリ別にグループ化されています。ページに2つのネストされたListViewコントロールがあります.1つはグループ名を出力し、2つ目はMessageDetailsにバインドされ、メッセージ自体を出力します。を作品
protected void MessageListDataSource_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
var db = new DataContext();
// parse the input strings from the web form
int categoryIDFilter;
DateTime dateFilter;
string catFilterString = MessagesCategoryFilter.SelectedValue;
string dateFilterString = MessagesDateFilter.SelectedValue;
// TryParse will return default values if parsing is unsuccessful (i.e. if "all" is selected"):
// DateTime.MinValue for dates, 0 for int
DateTime.TryParse(dateFilterString, out dateFilter);
Int32.TryParse(catFilterString, out categoryIDFilter);
bool showRead = MessagesReadFilter.Checked;
var messages =
from detail in db.MessageDetails
where detail.UserID == (int)Session["UserID"]
where detail.Message.IsPublished
where detail.Message.MessageCategoryID == categoryIDFilter || (categoryIDFilter == 0)
where dateFilter == detail.Message.PublishDate.Value.Date || (dateFilter == DateTime.MinValue)
// is unread, showRead filter is on, or message was marked read today
where detail.IsRead == false || showRead || detail.ReadDate.Value.Date == DateTime.Today
orderby detail.Message.PublishDate descending
group detail by detail.Message.MessageCategory into categories
orderby categories.Key.Name
select new
{
MessageCategory = categories.Key,
MessageDetails = categories.Select(d => d)
};
e.Result = messages;
}
このコードが、ちょうどdoesnのLinqDataSourceコントロールのためのコードビハインドで次のように巨大なLINQ文を貼り付ける」:私は、次のコードを持つメッセージをリストのページのコードビハインドで私と一緒に座ってください。
私はまだユーザーインターフェイスにクエリをコーディングしているようですが、今はSQLの代わりにLINQです。しかし、L2SクラスとUIの間に別のレイヤーを構築すると、LINQの柔軟性が低下すると感じています。全体のポイントは、データをフェッチするために書くコードの量を減らすことではありませんか?
LINQ to SQLの使用方法を誤解していると思いますか?アドバイスをいただければ幸いです。
これは私が使い終わったアプローチです。役に立つアドバイス、ありがとう。 –
あなたが純粋な人であればIListを返す;)あるいはもっと良いIEnumerable –