C#的 LINQ 查询是不是所有编程语言中最优雅的?为什么其它编程语言不学习?写起来太爽了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
drymonfidelia

C#的 LINQ 查询是不是所有编程语言中最优雅的?为什么其它编程语言不学习?写起来太爽了

  •  1
     
  •   drymonfidelia 3 月 11 日 2440 次点击
    这是一个创建于 43 天前的主题,其中的信息可能已经有所发展或是发生改变。
    16 条回复    2026-03-12 21:27:42 +08:00
    chingyat
        1
    chingyat  
       3 月 11 日
    虽然语法很优雅,但毕竟是一种 DSL 。
    Rust 的 Sqlx 更优雅吧,直接写 SQL ,支持编译时验证。
    drymonfidelia
        2
    drymonfidelia  
    OP
       3 月 11 日
    @chingyat LINQ 编辑时就能验证和自动补全,直接写 SQL 复杂的查询逻辑很容易写错
    ratazzi
        3
    ratazzi  
       3 月 11 日
    你去看看 Rails
    levelworm
        4
    levelworm  
       3 月 11 日
    这玩意能直接进入 Databricks 数据库查询吗?能的话倒是有点实用价值。实在是不习惯 PySpark 的一个个函数调用的写法,但是又不喜欢纯 SQL 。。。

    https://www.cdata.com/kb/tech/databricks-ado-linqtoef.rst

    好像还真可以。
    liuliuliuliu
        5
    liuliuliuliu  
    PRO
       3 月 11 日
    ```
    因为 LINQ 不仅是语言特性,还需要库的支持,它要求:

    语言支持扩展方法
    语言支持将 lambda 表达式编译到 AST
    库层面提供 AST 抽象
    语言支持反射,且泛型保留类型信息到运行时(具现化泛型)
    语言支持 generator (yield)

    ```

    ```
    因为非常非常难……
    C# 3.0 可以说是 C#历史上最大的一次改动,从语言到库的层面可以说是做了革命性的变化,单单是上下文关键字,就一次性新增了 from 、where 、select 、group 、by 、join 、equals 、on 、let 、order 、into 、asscending 、descending 一大堆,加上原有的 in 啥的。这特么就是重新设计了一个新的语言。
    而 C#为了支持 LINQ Expression ,从语言到库都是进行了一系列的改造:

    ```
    来自
    https://www.zhihu.com/question/447572572
    iorilu
        6
    iorilu  
       3 月 11 日
    现在都 AI 了,我看现在很多程序都用原生 SQL 了,反正都是 AI 写。
    GiantHard
        7
    GiantHard  
       3 月 11 日
    F# 还提供了一个更加进化的版本 Computation Expression ,允许自定义关键字
    metalvest
        8
    metalvest  
       3 月 11 日
    爽就对了,要不然为什么叫语法糖呢,语法糖都爽
    Al0rid4l
        9
    Al0rid4l  
       3 月 12 日
    msg7086
        10
    msg7086  
       3 月 12 日
    如果你说的是链式函数表达从集合里取数据,那别的语言早就有了。
    如果你说的是 from select 的话,那确实主要就 C#有,毕竟要对语言结构做大改,而且写起来也没很大的区别,我直接写链式函数表达不行吗。收益太小了,C#频繁对接数据库所以用途还大点,别的语言没有那么紧密的绑定,又或者是没有足够的财力去支撑这么大的改动。
    alwaysol
        11
    alwaysol  
       3 月 12 日
    确实好用,所以我写 js 时也调用 linqjs 库来处理数据
    runliuv
        12
    runliuv  
       3 月 12 日
    在 LINQ 上,只有 C# 和其它。 其它语言没这个机遇。
    exonuclease
        13
    exonuclease  
       3 月 12 日
    其实平时也没人用查询语法 我们都写链式调用
    exonuclease
        14
    exonuclease  
       3 月 12 日
    而且用不好的话会有性能问题 hotpath 还真不怎么敢写
    drymonfidelia
        15
    drymonfidelia  
    OP
       3 月 12 日
    @exonuclease hotpath 可以用 zlinq ,零分配的可以避免 GC
    drymonfidelia
        16
    drymonfidelia  
    OP
       3 月 12 日
    @msg7086 即使是链式函数,C#写起来也是最爽的,其它语言不是不能自动补全就是跑起来才能发现写错,例如 sqlalchemy 我查询条件写的乱七八糟也能运行,运行的时候才报错 (很久没用了,不知道是不是这个)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3527 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 58ms UTC 00:19 PVG 08:19 LAX 17:19 JFK 20:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86