【问题标题】:Efficient and proper Linq queries from database来自数据库的高效和适当的 Linq 查询
【发布时间】:2011-05-07 10:12:39
【问题描述】:

来自 MSDN 的示例 linq 查询:

var expensiveInStockProducts =
    from p in products
    where p.UnitsInStock > 0 && p.UnitPrice > 3.00M
    select p;

此查询是立即从数据库表中选择每一列,还是返回某种指针来按需检索实际列数据? IE。如果我的表中有 50 列,而我在实际代码中只使用了一个 p.UnitsInStock,那么我检索的数据是否比我预期的多 50 倍?

【问题讨论】:

  • 你说的是列还是行?您似乎在谈论行,但我不确定。

标签: c# asp.net linq


【解决方案1】:

如果您对此进行了调试,那么您可能会在查询的SELECT ... 部分中看到products 表中的每一列

如果您使用select p.UnitsInStock,您只会在查询的SELECT ... 部分看到它。

所以要回答您的问题,是的,它会选择每一列,除非您指定您想要的内容或将选择转储到匿名对象中,如下所示:

var expensiveInStockProducts =
    from p in products
    where p.UnitsInStock > 0 && p.UnitPrice > 3.00M
    select new { p.UnitsInStock, p.SomeOtherColumn }

【讨论】:

  • 好的,那么简短的回答是,如果不需要大部分列数据,那么粗略地“选择 p”是一个糟糕的举动?
  • 是的,如果你只想要一个列,那么只选择 p.ColumnName。如果您需要多个列,请即时创建一个新对象并获取您想要的列。
【解决方案2】:

如果您想查看生成的 SQL,我建议您使用 LINQPad,它确实有助于可视化,只是为了帮助您完成您想要的(如果您只需要本地数据)使用匿名对象或选择具体类在您的应用程序模型中,

所以

匿名

var expensiveInStockProducts =
from p in products
where p.UnitsInStock > 0 && p.UnitPrice > 3.00M
select new {
           p.ColumnIWant1,
           p.ColumnIWant2
          };

或者对于一个具体的类

var expensiveInStockProducts =
from p in products
where p.UnitsInStock > 0 && p.UnitPrice > 3.00M
select new MyClass() {
          ColumnIWantAsField1 = p.ColumnIWant1,
          ColumnIWantAsField2 = p.ColumnIWant2
          };

【讨论】:

  • 这对我有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 2015-07-03
相关资源
最近更新 更多