【问题标题】:LINQ Select Statement making many SQL Calls进行许多 SQL 调用的 LINQ Select 语句
【发布时间】:2013-05-08 10:10:16
【问题描述】:

我正在尝试在链接到数据库查询的 IQUEeryable 上运行 Select。它工作正常,但对于所有被选择的属性,它运行一个单独的查询。

我的代码看起来像这样

IQueryable<MyDataSource> data = [Some Complicated Query I've been Building Up];

var results = data.Select(d => new 
{
A = d.A,
B = d.B,
C = d.C

}).Take(100).ToArray();

现在,这需要很长时间,尽管实际的查询不会花费那么长时间。 当我在其上运行 SQL 探查器时,我发现它为我选择的每个属性运行不同的 SQL 选择过程 - 对于我返回的每个实体(因此在上面的示例中,还有大约 300 个不同的查询作为执行过滤的实际第一个查询)。

我很确定我在这里做错了什么,这是什么?我期望它运行一个大型查询 - 从数据源中选择正确的列(你知道 Select top 100 d.A, d.B, d.C from [bla bla] ),而不是所有这些混乱。

【问题讨论】:

  • 你需要使用IQueryable&lt;MyDataSource&gt;而不是IEnumerable&lt;MyDataSource&gt;
  • 这些值是否被标记为惰性?另外:我很想看看[Some Complicated Query I've been Building Up] 是如何组合 - 特别是在什么时候它变成IEnumerable&lt;T&gt; 而不是IQueryable&lt;T&gt;dataIQueryable&lt;T&gt;,而不是 IEnumerable&lt;T&gt;,这一点非常重要,如果您想让 select 准确包含引用的 3 个属性。
  • 好的,抱歉。它的 IQueryable 感到困惑。固定...

标签: c# linq linq-to-sql


【解决方案1】:

您可以使用 DataLoadOptions 影响延迟/急切加载

这将强制对 B 进行预加载

DataLoadOptions options = new DataLoadOptions();
options.LoadWith<a>(a => a.B);
dc.LoadOptions = options;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-05
    • 2011-03-12
    • 2023-03-08
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多