Как вернуть данные из объединенных таблиц через объекты subsonic? - PullRequest
3 голосов
/ 04 августа 2011

Я использую ActiveRecord на Subsonic 3, и я действительно хочу сделать это:

  select * from foo
   left outer join bar on bar.Id = foo.barId
where foo.someProperty = 2

Я написал хранимую процедуру для извлечения данных, но Subsonic создал только объекты для хранения столбцов изfoo и bar.

Какой лучший способ вернуть данные в один объект, чтобы я мог просто связать его.В идеале я хочу, чтобы он был в списке <>, но без написания собственного класса, кажется, не существует способа, предоставляемого Subsonic.

1 Ответ

4 голосов
/ 04 августа 2011

У вас есть несколько вариантов здесь ...

Вы можете создать представление базы данных, которое выполняет ваше объединение, и SubSonic сгенерирует тип данных для вашего представления, тогда ваш выбор будет аналогичен выбору из любой другой таблицы.

В качестве альтернативы, вы можете использовать выражение Linq для объединения в анонимный или динамический тип (если вы используете .net 4) Например:

public List<dynamic> LoadData(int id)
{
  var data = from f in db.Foo
             from b in db.Bar.Where(x => x.Id == f.BarId).DefaultIfEmpty()
             where f.SomeProperty == id
             select new
             {
               SomeProperty = f.Something,
               AnotherProperty = b.SomethingElse
             };
  return data.Cast<dynamic>().ToList();
}

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

public class MyData
{
  public string SomeProperty { get; set; }
  public string AnotherProperty { get; set; }
}

public List<MyData> LoadData(int id)
{
  var data = from f in db.Foo
             from b in db.Bar.Where(x => x.Id == f.BarId).DefaultIfEmpty()
             where f.SomeProperty == id
             select new MyData()
             {
               SomeProperty = f.Something,
               AnotherProperty = b.SomethingElse
             };
  return data.ToList();
}
...