【问题标题】:Linq To SQL: Can I eager load only one field in a joined table?Linq To SQL:我可以在连接表中只加载一个字段吗?
【发布时间】:2010-09-06 22:35:12
【问题描述】:

我有一个带有外键“ProductID”的“订单”表。

我想用 product name 在网格中显示订单,不使用 LazyLoad 以获得更好的性能,但我如果使用 DataLoadOptions 它检索 所有 产品字段,这些字段看起来像矫枉过正

有没有办法在第一个查询中检索产品名称? 我可以在 DBML 中设置一些属性吗?

在这个table 中说“外键值”在 Linq To SQL 中是“可见的”,但不知道这是什么意思。

编辑:更改了标题,因为我不确定是否有解决方案。
不敢相信没有人有同样的问题,这是一种非常常见的情况。

【问题讨论】:

    标签: .net sql performance linq-to-sql


    【解决方案1】:

    您要求的是 linq-to-sql 不提供的优化级别。我认为您最好的选择是创建一个查询,该查询准确地返回您想要的数据,可能是匿名类型:

    from order in DB.GetTable<Orders>()
    join product in DB.GetTable<Products>()
    on order.ProductID = product.ID
    select new { ID = order.ID, Name = order.Name, ProductName = product.Name };
    

    【讨论】:

    • 与所有这些匿名类型一起生活将是一场噩梦。
    • @Eduardo:相反,在某些情况下(尤其是这种情况)匿名类型实际上可以使事情变得简单得多。
    【解决方案2】:

    如果你在 linq 查询中只选择你想要的列,然后在查询上调用 .ToList() ,它将立即执行,并且只会带回你感兴趣的列。例如,如果你这样做这个:

    var q = from p in dataContext.products select p.ProductName;
    var results = q.ToList();
    

    您将返回存储在结果中的产品名称列表,当查询在服务器上执行时,它只会返回 ProductName 列。

    【讨论】:

    • 你的意思是有一个列表搜索列出每条记录的名称吗?
    • 否... 通常,使用 linq,当您运行“var q = from c in db.Custs select c;”时在您对 q 进行 foreach 之前,查询不会被执行。它还降低了所有客户领域。如果您运行 q.ToList(),“ToList”方法将遍历 q 并将结果插入列表中。
    • 另外...如果您更改查询中的字段,以便执行“var q = (from c in db.Custs select c.CustID, c.CustName).ToList(); "那么数据库将: 1)立即执行查询 2)只删除 CustID 和 CustName 列。
    • 但是我想带上所有的订单字段,加上产品名称(以及客户名称等)。这与问题有何关系?
    • 您说:1)您不想使用延迟加载 2)您有一组要删除的特定列,除了这些列之外,您不想要任何其他内容down 运行 ToList() 会预先运行查询,更改选择列表会准确显示您要求的字段集。
    【解决方案3】:

    我在另一个问题Which .net ORM can deal with this scenario 中得到了解决方案,这与 liammclennan 答案有关,但更清楚(也许问题也更清楚)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-20
      • 2010-09-21
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多