【问题标题】:.NET IQueryable to sql command text anonymouse type columns.NET IQueryable 到 sql 命令文本匿名类型列
【发布时间】:2015-05-27 12:03:27
【问题描述】:

我尝试将 LinqToSql (EF 6.1) IQueryable 查询转换为 SQL 文本 (MS SQL Server) 以在 util 中使用,将查询结果转换为 JSON,后者将绑定到 DataGrid。请不要问我,为什么会这样。我在this link 找到了很好的例子,一切都很好,直到我不使用匿名类型。例如:

var query = from t1 in DbContext.Table1.Where(r => r.Column1 == "filter")
  select new 
  {
    t1.Column1,
    t1.Column2,
    Column4 = t1.Column2 == "v" ? t1.Column3 : "InitValue"
  }

此函数创建 SQL 查询:

select t1.Column1 as [Column1]
  , t1.column2 as [Column2]
  , case when t1.column2 is null then t1.column3 else "InitValue" end as [C1]
from Table1 as t1 where t1.Column1 = 'v'

此函数将 Column4 转换为 C1 并且我无法将列 C1 绑定到 DataGrid 的问题。我怎样才能将 Column4 翻译成 Column4 而不是 C1

【问题讨论】:

    标签: c# .net linq-to-sql iqueryable


    【解决方案1】:

    我不确定您的查询的有效性(原始似乎是通过 Column1 匹配“过滤器”进行选择,并且 sql 匹配 'v' 并且 == 不是有效的 sql),但要回答您的问题,你需要做的就是替换

      as [C1]
    

     as [Column4]
    

    我原以为更准确的sql翻译会是

    select 
       t1.Column1 as [Column1]
     , t1.column2 as [Column2]
     , case when t1.column2 = 'v' then t1.column3 else 'InitValue' end as [Column4]
    from Table1 as t1 
    where t1.Column1 = 'filter'
    

    【讨论】:

    • 对不起,我写了这段代码,比如我的代码很大。我理解你的回答,但是这个翻译是通用的,这个函数将用于许多 LINQ 查询,如果有多个列(C1、C2、C3、...)我怎么知道 LINQ 查询中的哪一列匹配到 SQL 查询中的列?我讲述了函数,我该如何修改它,以进行正确的 LINQ 查询翻译?
    【解决方案2】:

    这样的语句
    Column4 = t1.Column2 == "v" ? t1.Column3 : "InitValue"
    

    在 SQL Server 中将始终转换为 CASE 并以大写“C”命名为 Case 后跟数字 - 在 SQL 查询中的位置,因此您只需将 DataBound Column 定义为 [C1] 并且只要您使用它就会保持一致不会将您的 Linq 中的语句移动到另一个地方。

    【讨论】:

      猜你喜欢
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      相关资源
      最近更新 更多