用于检索单个嵌套子实体的 Linq 方法语法

标签 linq entity-framework

我想知道我是否可以获得以下方面的帮助。我正在使用 EF 检索数据集,如下所示。

var booking = this.GetDbSet<Booking>().Include(c => c.BookingProducts.Select(d => d.Product.PrinterProducts.Select(e => e.ProductPrices))).Single(c => c.BookingId == bookingId)

在 PrinterProduct 中,有一个用于附加实体打印机的外键 PrinterId。对于 Booking 实体,我还通过外键将 PrinterId 链接到附加实体 Printer。

我希望做的是仅检索与预订实体中保存的 PrinterId 相关的 PrinterProduct,而不是我的代码中的所有 PrinterProduct。我尝试过使用 Join,但陷入了困境!

感谢您的帮助!

编辑:

对象结构:

public class Booking
{
    public Guid BookingId { get; set; }
    public string BookingName { get; set; }
    public Printer Printer { get; set; }
    public IEnumerable<BookingProduct> BookingProducts { get; set; }
}

public class BookingProduct
{
    public int BookingProductId { get; set; }
    public Booking Booking { get; set; }
    public Product Product { get; set; }
}

public class Product
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public IEnumerable<PrinterProduct> PrinterProducts { get; set; }
}

public class PrinterProduct
{
    public int PrinterProductId { get; set; }
    public Product Product { get; set; }
    public Printer Printer { get; set; }
    public IEnumerable<ProductPrice> ProductPrices { get; set; }
}

public class ProductPrice
{
    public int ProductPriceId { get; set; }
    public PrinterProduct PrinterProduct { get; set; }
    public decimal Price { get; set; }
}

public class Printer
{
    public int PrinterId { get; set; }
    public string PrinterName { get; set; }   
    public IEnumerable<Booking> Bookings { get; set; }
    public IEnumerable<PrinterProduct> PrinterProducts { get; set; } 
}

最佳答案

考虑到您的问题中新添加的类结构,我希望我现在可以澄清它。

据我所知,BookingsProducts具有多对多关系(其中BookingProduct用作连接)。 Product 也是如此。和Printer (其中 PrinterProduct 用作连接)。 据我了解,您正试图从单数 Booking 中获取项目单数PrinterProduct 。我没有看到任何有效的方法来做到这一点而不引入与数据不一致的可能性。您期望某些列表返回一个结果。如果它只有一个结果,为什么它首先是一个列表?

  • 您有一个Booking 。你拿它的BookingProducts 。现在你有很多东西了。
  • 您选择Product来自每个人BookingProduct 。如果都是BookingProducts拥有相同的产品,你很幸运,只会拥有 List<Product>与单个Product在里面。但是,没有什么可以阻止系统返回许多不同的产品,因此我们假设您现在持有 List几个Products
  • 来自每个 Product在列表中,您现在获取其所有 PrinterProducts 。您现在拥有许多PrinterProducts 许多 Products .

如您所见,您最终会得到一个完整的项目列表,而不仅仅是您期望的单个实体。

Bookings , ProductsPrinters全部相互独立连接,就像一个三角形。我见过这种说法是正确的,但十有八九这不是你想要的;并且只会导致可能的数据不一致。 这样看: Product 有可能吗?有一个Printer 除了 Printer这已经与 Booking 相关?如果没有,那你们为什么会有两个关系呢?这仅引入了Booking.Printer的可能性。与 PrinterProduct.Printer 不同.

您的关系模型被设置为产生许多结果,但我认为您在某些地方期望单个结果。我建议再次查看您的数据模型,因为它没有反射(reflect)您希望对其执行的操作类型。在适用的情况下,将多对多关系更改为一对多,您应该能够以更符合逻辑的方式遍历数据模型,类似于我在之前的答案中提供的答案。

关于用于检索单个嵌套子实体的 Linq 方法语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18358512/

相关文章:

c# - 返回具有匿名类型的已过滤 IQueryable<T>

C# - EF4 - 获取服务器的 DateTime.Now

c# - 找不到 Entity Framework 4 注释

linq - 使用 Fluent 语法的 LINQ 嵌套 GroupBy

c# - 如果第一次没有找到任何内容,如何正确地多次查询数据库以获取某个值 C#

c# - IQueryable where 子句

c# - Entity Framework 4.1 无法创建 MySQL 数据库

entity-framework - 在 LINQ to SQL 查询中使用了 'new' 运算符,但在每个结果中都引用了相同的实例

c# - 用LINQ查询基本问题

c# - 使用 DataContext 从 LINQ 查询填充 DataTable 的最快方法