使用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类传递给视图。
答案 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);
通过这种方式,您可以利用类型推断来使您的方法返回匿名类型。您必须使用这种丑陋的方法传递示例对象才能使其工作。我不建议你这样做,但我相信这是唯一的方法。