【问题标题】:Select multiple joined tables into multiple variables in SQL queries or LINQ在 SQL 查询或 LINQ 中选择多个连接表到多个变量中
【发布时间】:2018-02-23 18:35:28
【问题描述】:
SELECT O.*, U.*, C.*, P.*, S.* 
INTO OV, Usuarios, Clientes, Proposta, Status 
FROM[dbo].[TB_OV] O 
INNER JOIN dbo.TB_Usuarios U on U.id = O.userinsert 
INNER JOIN dbo.TB_Clientes C on C.id = O.ENDFAT 
INNER JOIN dbo.TB_Status S on S.id = O.status 
LEFT JOIN TB_Proposta P on P.id = O.ID_PROP 
WHERE O.status = 214 ORDER BY O.DTSOL, O.DtdeFaturamento

我正在用 C# 开发一个 Web 系统,而我正在尝试做的查询之一就是这个...
我想知道执行此操作或类似操作的正确语法是什么。

我需要确切知道的是如何将这五个表选择为五个不同的变量,就像一个对象一样,我可以稍后在 C# 中将其转换为对象类型。

否则,我尝试使用 C# 中的 LINQ to SQL 执行此操作,但我仍然没有从 LINQ to SQL 中的查询中获得任何结果到这些表。

拉姆达:

var query = db.TB_OV
    .Join(db.TB_Usuarios, OV => OV.USERINSERT, U => U.ID, (OV, U) => new { OV, U })
    .Join(db.TB_Clientes, Z => Z.OV.ENDFAT, CL => CL.ID, (Z, CL) => new { Z, CL })
    .Join(db.TB_Status, Z => Z.Z.OV.STATUS, ST => ST.ID, (Z, ST) => new { Z, ST })
    .Join(db.TB_Proposta, Z => Z.Z.Z.OV.ID_PROP, P => P.ID, (Z, P) => new { Z, P })
    .Where(Z => Z.Z.Z.Z.OV.STATUS == 214)
    .Select(Z => new OperacoesListaSolFaturamento
    {
        OV = Z.Z.Z.Z.OV,
        Usuarios = Z.Z.Z.Z.U,
        Clientes = Z.Z.Z.CL,
        Status = Z.Z.ST,
        Proposta = Z.P
    });

流利:

var query = from O in db.TB_OV
            join U in db.TB_Usuarios on O.USERINSERT equals U.ID
            join C in db.TB_Clientes on O.ENDFAT equals C.ID
            join S in db.TB_Status on O.STATUS equals S.ID
            join P in db.TB_Proposta on O.ID_PROP equals P.ID
            where O.STATUS == 214
            select new OperacoesListaSolFaturamento
            {
                OV = O,
                Usuarios = U,
                Clientes = C,
                Status = S,
                Proposta = P
            };

有没有办法做到这一点?通过 LINQ 或 SQL 查询。

【问题讨论】:

  • 你的问题有点不清楚,你能通过添加一些样本和期望的结果来澄清它吗?
  • 好吧,对不起,我会尽量简化
  • 现在试着理解并告诉我你是否意识到了
  • 这不像你想象的那样工作。 1. * 符号替换为所有实际列。 2. Into 子句不支持多个目标表。
  • 那么我该如何以其他方式做到这一点?使用 SQL 查询或 LINQ

标签: c# sql linq select join


【解决方案1】:

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

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

因此,流畅查询的主要问题是您没有正确翻译 LEFT JOIN

var query = from O in db.TB_OV
            where O.STATUS == 214
            join U in db.TB_Usuarios on O.USERINSERT equals U.ID
            join C in db.TB_Clientes on O.ENDFAT equals C.ID
            join S in db.TB_Status on O.STATUS equals S.ID
            join P in db.TB_Proposta on O.ID_PROP equals P.ID into Pj
            from P in Pj.DefaultIfEmpty()
            orderby O.DTSOL, O.DtdeFaturamento
            select new OperacoesListaSolFaturamento
            {
                OV = O,
                Usuarios = U,
                Clientes = C,
                Status = S,
                Proposta = P
            };

【讨论】:

    猜你喜欢
    • 2021-08-16
    • 2022-01-19
    • 2023-03-20
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多