gpt4 book ai didi

c# - LINQ 查询优化 : specifically, let 子句的位置重要吗?

转载 作者:太空宇宙 更新时间:2023-11-03 11:13:51 25 4
gpt4 key购买 nike

我对编译和优化 LINQ 表达式以及是否需要仔细考虑表达式中 let 和 where 子句的顺序很感兴趣。

例子如下:

var query = 
from record in Database.Table
let recordName = record.GetName()
let notUsed = UselessData()
let stuff = DoSomethingIntensiveWith(record)
where recordName == "foobar"
select stuff;

foreach (string item in query) {
Console.WriteLine("item => '{0}'", item);
}

问题/假设:

  • record.GetName() 必须解析才能执行 where条款。
  • notUsed 从未在表达式中使用,因此将调用 UselessData()有吗?
  • stuff 仅在 recordName 等于“foobar”时才需要。将要DoSomethingIntensiveWith() 对每条记录或仅对记录执行其中 recordName 等于“foobar”?

如果我想确保 DoSomethingIntensiveWith() 只在recordName 等于“foobar”,我是否需要将 let 语句放在where子句,如下:

var query = 
from record in Database.Table
let recordName = record.GetName()
let notUsed = UselessData()
where recordName == "foobar"
let stuff = DoSomethingIntensiveWith(record)
select stuff;

foreach (string item in query) {
Console.WriteLine("item => '{0}'", item);
}

与此同时,我将尝试一些真实的代码和调试器。患病的报告我的发现。

最佳答案

如果这是 LINQ-to-Objects,那么:是的,你是。标准的 Enumerable.* 实现在按顺序应用事物方面非常直接。您不一定需要所有 let 子句,但事情仍然按顺序完成,并且该顺序得到遵守。如果它是 LINQ-to-anything-else,那么一切都将失败。

这很容易证明:

using System;
using System.Linq;
class Foo
{
public Foo(string value)
{
Value = value;
}
public string Value { get; private set; }
public string Expensive()
{
Console.WriteLine(Value);
return Value;
}
static void Main()
{
var foos = new[] {
new Foo("abc"),
new Foo("def")};
Console.WriteLine("query1:");
var query1 = (from obj in foos
let val = obj.Value
where val.StartsWith("a")
let result = obj.Expensive()
select result).ToArray();
Console.WriteLine("query2:");
var query2 = (from obj in foos
let val = obj.Value
let result = obj.Expensive()
where val.StartsWith("a")
select result).ToArray();
}
}

第一个查询过滤then 项目(因此它只对匹配的记录进行昂贵的操作),而第二个查询计算两者的昂贵操作:

query1:
abc
query2:
abc
def

应该注意的是,let 实际上只是通过Select 实现的——它是从源数据到查询内部使用的匿名类型的投影。

关于c# - LINQ 查询优化 : specifically, let 子句的位置重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13231500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com