我想知道我是否可以从以下方面获得帮助。我正在使用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用于其他实体打印机。使用预订实体我也有PrinterId也通过外键链接到附加实体打印机。
我希望做的只是检索与预订实体中保存的PrinterId相关的PrinterProduct,而不是我的代码中的所有PrinterProducts。我曾经尝试过使用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; }
}
答案 0 :(得分:1)
如果您已设置导航属性,则可以浏览它:
var myBooking = ... //A single Booking, don't know how you retrieve it in your case.
var myPrinter = myBooking.Printer; //the Printer that is related to the Booking.
var myPrintproducts = myPrinter.PrintProducts; //The products that are related to the printer.
您不需要保留嵌套选择语句,这只会造成不必要的混淆和开销成本。 请记住,您需要在db上下文的范围内执行此操作。每次尝试访问属性时,EF都会从数据库中填入所需的变量。只要有一个开放的数据库连接,就可以了。
修改强>
如果您确实需要优化它,可以使用Select语句。但是你只需要一个。例如:
var myPrintproducts = db.Bookings.Single( x => x.ID == some_id_variable ).Select( x => x.Printer.PrintProducts);
但除非你有非常严格的性能要求,否则只需浏览它就可以获得更好的代码可读性。
答案 1 :(得分:1)
鉴于您问题中新添加的类结构,我希望我现在可以清除它。
从我看到的情况来看,Bookings
和Products
具有多对多关系(其中BookingProduct
用作连接)。 Product
和Printer
(其中PrinterProduct
用作连接)也是如此。
根据我的理解,您试图从单数Booking
项到单数PrinterProduct
。在没有引入与数据不一致的可能性的情况下,我没有看到任何有效的方法。你期待一些列表给你一个结果。如果它只是一个结果,为什么它首先是一个List?
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
不同的可能性。
您的关系模型设置为产生许多结果,但我认为您希望在某些地方获得单一结果。我建议再看看你的数据模型,因为它没有反映你希望对它执行的操作类型。在适用的情况下将多对多关系更改为一对多关系,您应该能够以更合理的方式遍历数据模型,类似于我之前的答案中提供的答案。