如何使用 LINQ 将对象集合映射到 SQL

本文关键字:映射 SQL 集合 对象 何使用 LINQ | 更新日期: 2023-09-27 18:33:59

我正在做一些测试,以体验使用 LINQ 到 SQL 的对象关系映射,并且我遇到了尝试使多对多关系正常工作的问题。为简单起见,假设我有一个 Order 类,该类拥有已订购产品的集合。如何使用 LINQ 将此产品集合映射到 SQL?

[Table(Name = "OrderTable")]
public class Order
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true)]
    public int ID;
    [Column]
    public string Customer;
    [Association(ThisKey = "ID", OtherKey = "ID")] // Not working
    public EntitySet<Product> products = new EntitySet<Product>();
}
[Table(Name = "ProductTable")]
public class Product
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true)]
    public int ID;
    [Column]
    public string Name;
    [Column]
    public double Price;
}

我尝试使用 EntitySet 作为容器来保存订单的产品,但它不起作用,因为 LINQ 查询返回具有空产品集合的 Order 对象。

PS:从这个问题来看,我似乎需要创建一个第三个类来跟踪订单-产品关系,但我希望找到一种方法来做到这一点,而不必创建另一个类。

如何使用 LINQ 将对象集合映射到 SQL

除了 Order-Product 表之外,没有一种方法可以在数据库中对此进行建模,并且 Linq-to-SQL 实体与 SQL 表匹配。 不幸的是,这是(据我所知)使用 Linq-to-SQL 对此进行建模的唯一方法。

创建模型后,可以通过右键单击实体并选择"查看代码"(假设是 DBML 设计器,否则只需将其添加到代码中),然后添加如下所示的内容来创建属性来隐藏此限制:

public partial class Order
{
    public IEnumerable<Product> Products
    {
        get
        {
            return OrderProducts.Select(op => op.Product);
        }
    }
}

正如@TheEvilPenguin指出的,

  • LINQ-to-SQL 将类映射到表
  • 您需要一个 OrderProduct 表来促进数据库中的这种多对多关系
  • 因此,LINQ to-SQL 也需要映射该表。

将该联接表拖到设计器上。您将在Order上拥有一个名为 OrderProduct 的属性,并且您将能够通过 OrderProducts 属性导航到Order上的Products

foreach (var op in Order.OrderProducts)
{
    var product = op.Product;
}