.NET IQueryable到sql命令文本anonymouse类型列

时间:2015-05-27 12:03:28

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

我尝试将translane 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

2 个答案:

答案 0 :(得分:0)

我不确定您的查询的有效性(原文似乎是通过Column1匹配"过滤"并且sql匹配' v'和== isn& #39; t 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'

答案 1 :(得分:0)

这样的陈述
Column4 = t1.Column2 == "v" ? t1.Column3 : "InitValue"

将始终在SQL Server中转换为CASE并以资本命名C' C'对于Case后跟数字 - 在SQL查询中的位置,所以你可以将DataBound Column定义为[C1],只要你不将Linq中的语句移动到另一个地方它就会保持一致。