Разделение проблем: возврат проецируемых данных между слоями из запроса Linq - PullRequest
1 голос
/ 29 ноября 2011

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

Предположим, у меня есть уровень доступа к данным.Он знает о структуре сущностей и о том, как с ней взаимодействовать.Но это не волнует, кто получает к нему доступ.У меня есть одно интересное требование: запросы в структуре сущностей возвращают проецируемые данные, которые не являются частью самой модели сущностей. Пожалуйста, не просите меня изменить эту часть требования и сделать POCO для каждого типа возврата, поскольку это не лучший дизайн, учитывая проблему, которую я пытаюсь решить. Ниже приведен пример.

public class ChartData
{
    public function <<returnType??>> GetData()
    {
        MyEntities context = new MyEntities();
        var results = from context.vManyColumnsOfData as v
                      where v.CompanyName = "acme"
                      select new {Year = v.SalesYear, Income = v.Income};
        return ??;
    }
}

Затем я хотел бы, чтобы уровень пользовательского интерфейса ASP.Net мог вызывать уровень доступа к данным для получения данных, чтобы связать их с элементом управления.Уровень пользовательского интерфейса не должен знать, откуда поступили данные.Нужно только знать, что у него есть данные, которые ему нужно связать.Ниже приведен пример.

    protected void chart_Load(object sender, EventArgs e)
    {
       // set some chart properties
       chart.Skin = "Default";
       ...

       // Set the data source
       ChartData dataMgr = new ChartData();
       <<returnType?>> data = dataMgr.GetData();
       chart.DataSource = data;
       chart.DataBind();
    }

Каков наилучший способ отправить спроецированные данные linq обратно на другой слой?

Ответы [ 4 ]

2 голосов
/ 29 ноября 2011

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

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

Однако, чтобы соответствовать установленным ограничениям, вы можете вернуть IEnumerable<object> из метода и использовать его или var в месте вызова и полагаться на динамическое связывание элемента управления для получения данных. you не поможет, если вам нужно иметь дело с объектом программно, но он отлично подойдет для привязки данных.

2 голосов
/ 29 ноября 2011

Если вам не нужно использовать проецируемый тип статически, просто верните IEnumerable<object>.

0 голосов
/ 29 ноября 2011

Ваш метод GetData может использовать IEnumerable («старый» неуниверсальный интерфейс) в качестве возвращаемого типа.

Любое динамическое разрешение (например, ASP.NET или XAML).bindings) должны работать должным образом, что, по-видимому, является тем, что вы хотите сделать.

Однако, если вы хотите использовать результаты в своем коде, вам, вероятно, придется прибегнуть к ключевому слову dynamic в .NET 4..

Следующий пример может быть запущен в LINQPad (в режиме «Программа C #») и иллюстрирует это:

void Main()
{
  var v = GetData();

  foreach (dynamic element in v)
  {
    ((string)element.Name).Dump();
  }
}

public IEnumerable GetData()
{
  return from i in Enumerable.Range(1, 10)
         select new
         {
              Name = "Item " + i,
              Value = i
         };
}

Имейте в виду, что при разработкеПодобное кодирование вызовет недовольство большинства людей и может повлиять на производительность.

0 голосов
/ 29 ноября 2011

Вы не можете вернуть анонимный тип, поэтому в основном для этого вам понадобятся POCO, даже если они вам не нужны.

"не лучший дизайн, учитывая проблему, которую я пытаюсь решить"

Не могли бы вы объяснить, чего вы пытаетесь достичь немного больше?Может быть возможным вернуть некоторый тип списка, содержащий словарь элементов (то есть строк и столбцов).Подумайте, что-то вроде нетипизированного набора данных (гадость)

...