Linq to sql 如何将多个类作为IQueryable返回<;T>;

Linq to sql 如何将多个类作为IQueryable返回<;T>;,linq-to-sql,Linq To Sql,使用Linq,我想返回一个包含客户和发票的对象 我理解从方法返回单个类型: public IQueryable<customers> GetCustomers() { return from c in customers select c; } public IQueryable GetCustomers() { 在客户中从c返回 选择c; } 但我很难找出多个对象: public IQueryable<???> GetCustomers

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

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

public IQueryable<customers> GetCustomers()
{
    return from c in customers
           select c;
}
public IQueryable GetCustomers()
{
在客户中从c返回
选择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.
}
public IQueryable GetCustomerWithInvoices()
{
在客户中从c返回
来自c发票中的库存
选择new{c,ci}//或者我可以指定列,但不能指定。
}

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

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

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

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

匿名类型是一种方便的方法 启用 开发人员要简洁地定义内联 代码中的CLR类型,而不具有 显式地提供一个正式的类 类型的声明。虽然 它们可以在很多场景中使用, 在以下情况下,这些方法特别有用: 查询和转换/成形数据 和林克


在该页面的注释线程中有一些很好的讨论。

在第二种情况下,您正在创建一个具有方法作用域的annonymous类型。要在方法边界之外传递注释性类型,需要将返回类型更改为object。然而,这违背了annonymous类型的目的(因为您失去了它提供的强类型),需要反射来访问所述类型的属性及其值


如果要将此结构保留为退货类型,则应创建一个由属性组成的类或结构,以保存客户和发票值。

如果确实需要,可以这样做,但这相当棘手

public IQueryable getCustomerwithinvoices(T示例对象)
{
从客户中的c返回
来自c.发票中的库存
选择new{c,ci}//或者我可以指定列,但不能指定。
}


var exampleObject=new{
客户c=新客户(),
发票i=新发票()
};

var returnedObjectOfAnonymousType=GetCustomerWithInvoices(exampleObject);


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

从技术上讲,您可以使函数的返回类型为
object
IEnumerable
,并且它可以工作。不过,你是否能对结果做些有用的事情还有争议。这正是我正在努力解决的问题。我只想从数据库中查询客户和发票,将它们发送到web页面,并将它们迭代出来;这应该不复杂。这是有道理的,现在对于一个名称…:)我创建了一个类,它将作为列表返回。但我不喜欢它,我宁愿返回一个对象并使用customer.invoices.invoiceid等获取数据。这看起来很混乱。无论如何,你应该可以这样做。在打开DataContext时,只需指定DataLoadOptions,即可在加载客户对象时包含发票。请参阅可能的副本