【问题标题】:Linq-to-SQL - multiple tablesLinq-to-SQL - 多个表
【发布时间】:2025-11-27 03:55:02
【问题描述】:

真正的基本 LINQ 问题,但有人可以告诉我它如何处理从多个数据库表中获取的数据。

例如,如果你有一个Products 表,那么使用 DBML 你会得到一个很好的Product 对象,你可以查询、更新、创建等(Product.NameProduct.Price 等)一切都很好。

但是,如果我有一个 LINQ 查询将 Product 连接到一堆其他表上,并将这些表中的列带回。数据库表到对象的 1:1 映射是不可能的,那么它返回的是什么?

例如。如果它是ProductCustomer 的组合,我将如何查询,例如客户名称:

object.customerName ?

是否默认作为数据集返回?

【问题讨论】:

  • 不清楚您的期望是什么?
  • 现阶段只是理论上的,所以没有要显示的查询。想象一个简单的 LINQ to SQL 连接,连接的结果是什么?是数据集吗?数据表?
  • 我强烈推荐使用 LinqPad 来测试和开发 LINQ 查询:linqpad.net。该网站也有一些很棒的教程,微软的 Linq 101 示例网站也有:code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
  • 太好了,谢谢。将检查 Linq 垫。

标签: c# sql linq linq-to-sql multiple-tables


【解决方案1】:

您通常会(即:经常,但并非总是如此)编写匿名类型,您的查询将返回其集合。例如,您命名属性,然后可以像使用任何其他类型一样访问它们。

【讨论】:

  • 啊...好吧。我认为它可能类似于自定义类......但匿名类型听起来很有趣。不确定我以前用过它们。我是否认为如果我创建了一个自定义类,那么我将需要我想要访问的所有返回值的属性?即使我打字我也知道是这样的......但只是确保!
  • 谢谢,这就是我要找的信息。必须阅读有关匿名类型的更多信息。根据您的经验,您会选择他们而不是自定义课程吗?哪些创建速度更快?
  • 匿名类非常适合塑造数据并在 LINQ 中使用它。我唯一会使用自定义类的情况是,如果我需要从方法返回成形数据并在其他地方使用它,在这种情况下,我需要像 List<MyCustomClass> 这样的返回类型。
  • +1 请记住,它们仅对只读操作有用。如果要更新,需要自己返回实体
【解决方案2】:

它创建了所谓的“匿名类型”。你可以这样使用它:

var x = from p in context.Products
        join o in OrderLines in p.Id = o.ItemId
        select new    // you are creating your anonymous type here
        {
            OrderId = o.Id,
            ProductName = p.Name,
            OrderDate = o.Date
        }

foreach (var y in x)
{
    Console.WriteLine("Product name: " + y.ProductName);
}

【讨论】:

    【解决方案3】:

    如果您的密钥设置正确,您应该能够执行像 Product.Customers 或其他方式的查询。或者你可以连接两个表,语法类似这样:

    from p in context.Products
    join c in context.Customers on p.CId equals c.Id
    

    【讨论】:

    • 好的,结果究竟是什么?我的意思是如果我只是查询产品表并返回一个产品对象就可以了。但是如果我加入几张桌子,结果是几张桌子的合并,我会得到什么样的对象?
    • 返回类型取决于你。您可以发送带有新 {} 的匿名类型或您想要的任何自定义类型。没必要给这个东西 -ve。
    【解决方案4】:

    根据查询的 select 子句,您通常会有匿名类型或自定义对象

    from p in context.Products
    join //with other tables with appropriate join conditions
    select new
    {
       prop1 = p.ProductName,
       prop2 = p.ProductId
    }
    

    这将返回具有 2 个属性 prop1 和 prop2 的匿名类型

    from p in context.Products
    join //with other tables with appropriate join conditions
    select new MyProduct()
    {
       prop1 = p.ProductName,
       prop2 = p.ProductId
    }
    

    这将返回名为 MyProduct 的自定义对象,您可以在对象初始化程序块中设置其属性

    【讨论】:

      【解决方案5】:

      您可以在数据库中创建一个视图,并通过 Linq-to-SQL 映射到一个对象。

      【讨论】: