如何通过亚音速对象从连接表中返回数据?

时间:2011-08-04 08:18:30

标签: c# linq subsonic subsonic3 generics

我在Subsonic 3上使用ActiveRecord,我实际上想要这样做:

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

我已经编写了一个存储过程来获取数据,但是Subsonic只创建了用于保存foo和bar列的对象。

将数据返回到单个对象的最佳方法是什么,所以我可以绑定它。理想情况下,我希望它在列表中<>但是,如果不编写我自己的课程,似乎没有亚音速提供的方法。

1 个答案:

答案 0 :(得分:4)

你有几个选择...

您可以创建一个连接的数据库视图,让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();
}