我想知道我是否可以获得以下方面的帮助。我正在使用 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; }
}
最佳答案
考虑到您的问题中新添加的类结构,我希望我现在可以澄清它。
据我所知,Bookings
和Products
具有多对多关系(其中BookingProduct
用作连接)。 Product
也是如此。和Printer
(其中 PrinterProduct
用作连接)。
据我了解,您正试图从单数 Booking
中获取项目为单数PrinterProduct
。我没有看到任何有效的方法来做到这一点而不引入与数据不一致的可能性。您期望某些列表返回一个结果。如果它只有一个结果,为什么它首先是一个列表?
- 您有一个
Booking
。你拿它的BookingProducts
。现在你有很多东西了。 - 您选择
Product
来自每个人BookingProduct
。如果都是BookingProducts
拥有相同的产品,你很幸运,只会拥有List<Product>
与单个Product
在里面。但是,没有什么可以阻止系统返回许多不同的产品,因此我们假设您现在持有List
几个Products
- 来自每个
Product
在列表中,您现在获取其所有PrinterProducts
。您现在拥有许多PrinterProducts
许多Products
.
如您所见,您最终会得到一个完整的项目列表,而不仅仅是您期望的单个实体。
Bookings
, Products
和Printers
全部相互独立连接,就像一个三角形。我见过这种说法是正确的,但十有八九这不是你想要的;并且只会导致可能的数据不一致。
这样看: Product
有可能吗?有一个Printer
除了 Printer
这已经与 Booking
相关?如果没有,那你们为什么会有两个关系呢?这仅引入了Booking.Printer
的可能性。与 PrinterProduct.Printer
不同.
您的关系模型被设置为产生许多结果,但我认为您在某些地方期望单个结果。我建议再次查看您的数据模型,因为它没有反射(reflect)您希望对其执行的操作类型。在适用的情况下,将多对多关系更改为一对多,您应该能够以更符合逻辑的方式遍历数据模型,类似于我在之前的答案中提供的答案。
关于用于检索单个嵌套子实体的 Linq 方法语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18358512/