在 LINQ to Entities 中使用交叉应用取消透视数据

Posted

技术标签:

【中文标题】在 LINQ to Entities 中使用交叉应用取消透视数据【英文标题】:Unpivoting data using cross apply in LINQ to Entities 【发布时间】:2022-01-12 19:11:29 【问题描述】:

我想在 Linq to Entities 中做这个查询,可以吗?

select v.account, v.value
from t cross apply
     (values (t.AccountID1, t.value),
             (t.AccountID2, - t.value)
     ) v(account, value) ;

此查询的作用是将作为列的 AccountID1 和 AccountID2 提取到行中,我也想在 LINQ to Entities 中执行此操作。

TL;DR:我正在尝试使用 LINQ to Entities 将列转换为行

【问题讨论】:

简答:否。 长答案:是的,但使用linq2db/linq2db.EntityFrameworkCore。如果您可以使用第三方扩展程序,我将展示示例。 到目前为止你有什么? 【参考方案1】:

你可以试试这样的

var results =
    from t in t
    from v in new[] 
        new account = AccountID1, value = t.value,
        new account = AccountID1, value = -t.value
    
    select v;

如果查询变得无法翻译,您可能需要将其全部拉回客户端并在此处取消透视,方法是将上述内容更改为 from t in t.ToList()

【讨论】:

如果它变得无法翻译?当然可以(只是测试它!)。将整个表格拉入内存是个坏建议。 @GertArnold 取决于提供者,有些可以翻译。我无权访问 Linq-to-Entities,因此无法测试 我认为没有任何供应商可以翻译这个。他们必须从 CLR 对象创建值元组。从未听说过这样做的 EF 提供商。如果您知道更多,请告诉。

以上是关于在 LINQ to Entities 中使用交叉应用取消透视数据的主要内容,如果未能解决你的问题,请参考以下文章

在实体框架和 Linq to Entities 中使用规范模式和表达式

使用 LINQ-to-Entities 搜索时忽略空字符串

使用Linq to Entities在一个请求中选择计数和计数

在Linq To Entities中使用多个列联接表

如何在 LINQ to Entities Join 中使用 Convert.Int32() 方法?

有没有办法将简单的 LINQ 查询封装在可与 LINQ to Entities 查询一起使用的扩展方法中?