从LinqToSQL(或EF)返回多个实体

时间:2011-12-05 07:49:01

标签: .net entity-framework linq-to-sql

是否可以从LinqToSql(或EF)查询中返回多个实体(查询在方法内),以便结果仍然可以组合?

这样的事情:

public IQueryable<KeyValuePair<Customer, Product>> GetCustomerEntities()
{
    return
    (
        from    customer in this.Context.Customers
                join
                product in this.Context.Products on customer.ID equals product.CustomerID       
        select  new KeyValuePair<Customer, Product>(customer, product)
    );
}

然后我想使用此方法的结果进一步构成查询,如:

this.GetCustomerEntities().Where(e => e.Key.Name == "my customer")

上面的方法编译但LinqToSql无法执行,因为它无法将 KeyValuePair 转换为SQL,这是预期的行为。

有可能以某种方式实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

这里的问题是运行时无法看到将customer传递给构造函数参数与查看e.Key是一回事,因为这两件事显然不相同。您可以尝试使用getter和setter创建自己的POCO类型,即

select new CustomerProduct { Customer = customer, Product = product }

并使用它代替KeyValuePair<Customer,Product>

在单个方法中,匿名类型将是显而易见的选择。

答案 1 :(得分:0)

this.GetCustomerEntities().ToList().Where(e => e.Key.Name == "my customer")

那应该有用。它不是最有效的东西,但它至少会运行。一旦枚举(使用ToList()),可查询将在SQL服务器上执行,任何进一步的操作将在内存中的枚举上。这允许您自由使用KeyValuePair类。

如果你想进一步专门构建查询以利用SQL,那么你应该参数化你的函数,并且首先只从数据库中获取你想要的行。