【问题标题】:Operators "AND" "OR" SQL [closed]运算符“AND”“OR”SQL [关闭]
【发布时间】:2018-02-23 21:36:12
【问题描述】:

您好,我正在尝试使用 Linq 将此代码从 SQL 转换为 C#

SQL代码是这样的:

SELECT N.Name,N.Unit,N.Typee,ID,NOTE 
FROM Table_A N join Table_B A on (N.ID = A.ID) 
join NotasQL G on ((N.Not1 = G.CODE) or (N.Not2 = G.CODE) ) 
join Attributes X on (A.AppID= X.AppID)

此代码在 SQL 中运行良好并具有预期结果,但是当我尝试在 C# 上复制此代码时,我不知道如何执行 OR 部分,这就是我目前所拥有的:

var Select = (from A in context.Table_A 
              from B in context.Table_B 
              from E in context.NotasQLs
              from D in context.Attributes 
             where (String.Compare(A.ID, B.ID, true) == 0 &&
                    String.Compare(B.AppID, D.AppID, true) == 0 
                     &&
                    (String.Compare(A.Not1, E.CODE, true) == 0 || 
                      String.Compare(A.Not2, E.CODE, true) == 0))

我的应用程序运行时已过期,因为查询没有选择任何内容,如果我删除或条件运行但我需要 OR。

【问题讨论】:

  • 也显示错误

标签: c# sql sql-server entity-framework linq


【解决方案1】:

用于将 SQL 转换为 LINQ 查询理解:

  1. FROM 子选择转换为单独声明的变量。
  2. 按 LINQ 子句顺序翻译每个子句,将单子和聚合运算符(DISTINCTTOPMINMAX 等)翻译成应用于整个 LINQ 查询的函数。
  3. 使用表别名作为范围变量。使用列别名作为匿名类型字段名称。
  4. 对多个列使用匿名类型 (new { ... })。
  5. JOIN 不是所有与AND 相等测试的条件必须使用连接外的where 子句或叉积(from ... from ...)然后where
  6. JOIN 两个表之间的多个 ANDed 相等测试条件应转换为匿名对象
  7. LEFT JOIN 是通过使用 into joinvariable 模拟的,然后从 from joinvariable 执行另一个操作,然后是 .DefaultIfEmpty()
  8. COALESCE 替换为条件运算符 (?:) 和 null 测试。
  9. IN 转换为.Contains()NOT IN 转换为!...Contains()
  10. x BETWEEN low AND high 转换为 low <= x && x <=
  11. SELECT * 必须替换为 select range_variable 或对于连接,一个包含所有范围变量的匿名对象。
  12. SELECT 字段必须替换为 select new { ... } 创建具有所有所需字段或表达式的匿名对象。
  13. 必须使用扩展方法处理正确的FULL OUTER JOIN

所以对于您的查询,

var ans = from N in Table_A
          join A in Table_B on N.ID equals A.ID
          from G in NotasQL
          where G.CODE == N.Not1 || G.CODE == N.Not2
          join X in Attributes on A.AppID equals X.AppID
          select new {
              N.Name,
              N.Unit,
              N.Typee,
              N.ID, // ??? not sure table for this column
              G.NOTE // ??? not sure table for this column
          };

【讨论】:

  • 非常感谢!这解决了我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 2017-08-01
  • 1970-01-01
相关资源
最近更新 更多