Часть веб-приложения, над которой я работаю, представляет собой область, отображающую сообщения от управления до 1 ... n пользователей. У меня есть проект DataAccess, который содержит классы LINQ to SQL и проект веб-сайта, который является пользовательским интерфейсом. Моя база данных выглядит следующим образом:Передовая практика re: LINQ To SQL для доступа к данным
пользователя -> MessageDetail < - Сообщение < - MessageCategory
MessageDetail является объединением таблица, которая также содержит IsRead флаг.
Список сообщений сгруппирован по категориям. У меня есть два вложенных элемента управления ListView на странице. Один выводит имя группы, а второй - внутри, который связан с 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;
}
Этот код работает, но торчит огромный заявление LINQ, как это в коде-за элемента управления LinqDataSource просто Безразлично» Я сижу прямо со мной.
Похоже, что я все еще кодирую запросы в пользовательский интерфейс, только теперь LINQ вместо SQL. Тем не менее, я считаю, что создание другого уровня между классами L2S и пользовательским интерфейсом сократит гибкость LINQ. Разве не все дело в сокращении объема кода, который вы пишете, для получения данных?
Есть ли какая-то возможная промежуточная точка, которую я не вижу, или я просто не понимаю, как предполагается использовать LINQ to SQL? Совет будет очень благодарен.
Это в значительной степени подход, который я использовал. Полезный совет, спасибо. – 2008-10-03 03:43:13