如何将多个类作为IQueryable <t> </t>返回

时间:2010-02-19 02:04:01

标签: linq-to-sql

使用Linq我想返回一个包含客户和发票的对象。

我理解从方法中返回单个类型:

public IQueryable<customers> GetCustomers()
{
    return from c in customers
           select c;
}

但是我在找出多个对象时遇到了麻烦:

public IQueryable<???> GetCustomersWithInvoices()
{
    return from c in customers
           from inv in c.invoices
           select new {c, ci}  // or I may specify columns, but rather not.
}

我有一种感觉,我正以错误的方式接近这一点。目标是从控制器调用这些对象,并将它们直接或使用formViewModel类传递给视图。

3 个答案:

答案 0 :(得分:1)

您不能从函数返回匿名类型,它们是严格的“内联”类。如果要将它们封装在函数中,则需要创建一个具体类型来保存您的成员。

正如您所提到的,使用视图模型是放置它们的好地方。

Here是一篇关于匿名类型的scottgu文章。从文章的结论:

  

匿名类型很方便   启用的语言功能   开发人员简明扼要地定义内联   代码中的CLR类型,没有   明确提供正式课程   声明的类型。虽然   它们可以在很多场景中使用,   有特别有用的时候   查询和转换/整形数据   与LINQ。

在该页面的评论主题中有一些很好的讨论。

答案 1 :(得分:1)

在第二种情况下,您将创建一个具有方法范围的匿名类型。要在方法边界外传递匿名类型,您需要将返回类型更改为object。然而,这会破坏匿名类型的目的(因为你失去了它提供的强类型),需要反射来访问属性及其所述类型的值。

如果要将此结构维护为返回类型,则应创建一个包含属性的类或结构来保存客户和发票值。

答案 2 :(得分:0)

如果你真的想,你可以这样做,但这很尴尬。

public IQueryable<T> GetCustomersWithInvoices(T exampleObject)
{
return from c in customers
from inv in c.invoices
select new {c, ci} // or I may specify columns, but rather not.
}

var exampleObject = new {
Customer c = new Customer(),
Invoice i = new Invoice()
};

var returnedObjectOfAnonymousType = GetCustomersWithInvoices(exampleObject);

通过这种方式,您可以利用类型推断来使您的方法返回匿名类型。您必须使用这种丑陋的方法传递示例对象才能使其工作。我不建议你这样做,但我相信这是唯一的方法。