Нужна помощь в переписывании этого запроса Linq, чтобы переместить его из кода в DAL в качестве объекта многократного использования - PullRequest
2 голосов
/ 03 апреля 2011

Я работаю над тем, чтобы перевести мой простой сайт asp.net на трехслойную архитектуру.В настоящее время у меня есть запросы Linq, подобные приведенному ниже, в моих файлах с выделенным кодом.По сути, этот фрагмент кода извлекает коллекцию данных о клиентах из базы данных, а затем связывает ее с элементом управления сеткой.

Мне интересно, может ли кто-нибудь подсказать мне, как переписать это, чтобы переместить его в мою новуюслой доступа к данным.Я думаю, что превращу его в класс (например, GetUserBoxesByStatus ()), который можно повторно использовать по всему сайту.

            var boxes = from p in sbm.Packages
                    where p.UserID == CurrentUserId && p.StatusID > 1 && p.StatusID < 3
                    select new { p.PackageTag, p.PackageName, p.DateReceived, p.DateShipped };
        GridView1.DataSource = boxes;
        DataBind();

Некоторые из опций, которые я исследовал, но не имели успеха в реализации,следующее:

DataTable - возвращение DataTable кажется лучшим решением, но также требуется много необязательного кода для определения таблицы (разве источник данных уже не отображен вмой Linq 2 Entities dbml?) IEneuerable --- Я думаю, что мог бы передать список IEnumerable между слоями, но после прочтения многих руководств по Linq я все еще немного растерялся DTO --- Концептуально японимаю, что такое DTO, но мне не ясно, как начать реализацию этого подхода POCO --- Опять же, концепция кажется достаточно логичной, но я не знаю, как применить это на практике

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

1 Ответ

1 голос
/ 03 апреля 2011

Создайте класс с нужными вам свойствами. Выберите в этот класс. Вернуть строго типизированный список (чтобы запрос выполнялся в DAL, а не в вашем представлении). Свяжите свой источник данных со списком.

public class PackageViewModel
{
   public string Tag { get; set; }
   public string Name { get; set; }
   public DateTime Received { get; set; }
   public DateTime Shipped { get; set; }
}

DAL

public List<PackageViewModel> GetUserBoxesByStatus( int userID, int minStatus, int maxStatus )
{
    return sbm.Packages
              .Where( p => p.UserID == userID
                            && p.StatusID > minStatus
                            && p.StatusID < maxStatus )
              .Select( p => new PackageViewModel
               {
                   Tag = p.PackageTag,
                   Name = p.PackageName,
                   Received = p.DateReceived,
                   Shipped = p.DateShipped
               })
              .ToList();
}
...