交叉应用 LINQ-TO-SQL

Posted

技术标签:

【中文标题】交叉应用 LINQ-TO-SQL【英文标题】:Cross Apply LINQ-TO-SQL 【发布时间】:2021-07-05 15:13:58 【问题描述】:

有以下表格:

create table Table_A (
    Id int primary key identity,
    Status int not null
)

create table Table_B (
    Id int primary key identity,
    Value varchar(80) not null
)

create table Table_C (
    Id int primary key identity,
    Time datetime not null
)

我想使用 lambda 表示法在 LINQ-to-SQL 中编写以下查询:

 select * from TABLE_A a
 cross apply (
    select top 1 c.Time from TABLE_B b
    inner join TABLE_C c on c.Id = b.Id
    where b.Id = a.Id
    order by c.Time asc
 ) d
 where a.Status = 10 and d.Time > '2021-03-09'

我该怎么做?

【问题讨论】:

【参考方案1】:

不确定 LinqToSql 是如何翻译的,但现代 LINQ 提供程序(如 EF Corelinq2db)应该将此 LINQ 查询翻译为 CROSS APPLY。

var date = new DateTime(2021, 03, 09);

var query =
    from a in db.TABLE_A
    from d in (
            from b in db.TABLE_B
            join c in db.TABLE_C on b.Id equals c.Id
            where b.Id = a.Id
            orderby c.Time
            select new  b, c 
        ).Taske(1)
    where a.Status == 10 && d.Time > date
    select new  a, d.b, d.c ;

【讨论】:

EF Core 5 不再像这样翻译它。它转换为 ROW_NUMBER() OVER(PARTITION BY 并在 LinqPad 中运行良好的所有这些查询超时(并产生 CROSS APPLY) 嗯,就是优化。在这种情况下可能是错误的。

以上是关于交叉应用 LINQ-TO-SQL的主要内容,如果未能解决你的问题,请参考以下文章

在 BLL 或 UI 中使用 Linq-to-SQL 实体?

如何改进 Linq-To-Sql 代码

Linq-to-SQL 和 DateTime 的怪异

如何将 LINQ-to-SQL 映射到 BLL 类?

使用 Linq-to-SQL 的 ADO.NET 数据服务

带有 XML 数据库字段的 Linq-to-SQL —— 为啥会这样?