2008-09-06 2 views
6

Часть веб-приложения, над которой я работаю, представляет собой область, отображающую сообщения от управления до 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? Совет будет очень благодарен.

ответ

5

Все ваши запросы LINQ должны быть в бизнес-логике класса, без изменений от старых методологий, таких как ADO.

Если вы - purist, вы всегда должны возвращать List (of T) из своих методов в бизнес-классе, фактически, файл datacontext должен быть видимым только для бизнес-классов. Затем вы можете манипулировать списком в пользовательском интерфейсе.

Если вы прагматист , вы можете вернуть объект IQueryable и сделать некоторые манипуляции в пользовательском интерфейсе.

+0

Это в значительной степени подход, который я использовал. Полезный совет, спасибо. – 2008-10-03 03:43:13

1

Независимо от LINQ, я думаю, что смешивание кода презентации с кодом, связанным с базой данных, не является хорошей идеей. Я бы создал простой слой абстракции БД поверх запросов LINQ. На мой взгляд, LINQ - это просто удобный инструмент, который не оказывает серьезного влияния на традиционный дизайн приложений.

Смежные вопросы