【问题标题】:LINQ translation doesn't give the same results as my SQL queryLINQ 翻译的结果与我的 SQL 查询不同
【发布时间】:2012-11-15 16:43:08
【问题描述】:

大家好,我有这个 SQL 查询 (MSSQL),我正在执行一个查询,其中连接的结果按日期为我提供了最新行的“顶”行,而没有重复的结果,您可以在此处找到我在做什么http://goo.gl/Uv0FR 事情是这样的,我已经完成了 SQL 查询,正在按预期工作,每个 IDKEY 在“where pi.PlazaIe in ('' ,'') 没有重复

Select * from PlazaI pi
join (
    Select * from PlazaE pe where 
    NOT EXISTS(SELECT 1 FROM PlazaE pe1 
    WHERE pe.Id_plaza = pe1.Id_plaza AND pe1.Fecha > pe.Fecha AND pe1.Fecha < GETDATE() and pe1.Id_Emp != 0) 
) pe on pe.Id_plaza = pieepo.Id_plaza
join Emp e on pe.Id_Emp = e.Id_Emp
join View ct on ct.Id_Nodo = pe.id_nodo
where pi.PlazaIe in ('value1','value2')

问题是当我尝试从 SQL 转换为 LINQ 时,无法实现。 (我是这个 Linq 世界的新手)

以下是我的 linq 查询。

var q1 = (from pe in db.PlazaEmpleados 
               where !db.PlazaEmpleados.Any
                                    (
                                     pe1 => (pe1.Id_plaza.Equals(pe.Id_plaza) && pe1.Fecha > pe.Fecha && pe1.Id_Emp != 0 && pe1.Fecha > DateTime.Now)
                                    ) select pe);

    var q2 = (from pi in db.Context
              join pe in (q1) on pi.Id_plaza equals pe.Id_plaza
                select new EmpVO
                  {
                    Id_Nodo = pe.id_nodo,
                    Id_plaza = pi.PlazaSome,
                    Num_Plaza = pi.Id_plaza,
                  }); 

当我运行这个 linq2sql 查询时,我得到了重复的结果,而不是每个值只有 1 个。所以问题是,我想知道是否有人可以很好地将 SQL 查询转换为 LINQ 查询或指出错误在哪里。

提前致谢。

【问题讨论】:

  • 使用sqltolinq将sql查询转换为linq表达式
  • 查看我编辑的帖子。我添加了另一个解决方案。

标签: sql linq linq-to-sql


【解决方案1】:

您对日期的检查不同:

LINQ:

pe1.Fecha > DateTime.Now

SQL:

pe1.Fecha < GETDATE()

你的 LINQ 不应该是:

pe1.Fecha < DateTime.Now

【讨论】:

  • 虽然这确实是一个“错误”,但我仍然在 Linq 中得到重复的行并且正在使用 SQL。我会尝试 sqltolinq 看看发生了什么..
  • 您好,我解决了这个问题实际上既不是这个答案,也不是我用“var rawSql = db.ExecuteQuery(sqlQuery);”做的其他问题
  • 感谢您的支持,至少我在这个答案中给了 +1 :)
【解决方案2】:

我没有找到解决我问题的答案,所以我最后做的是使用

db.ExecuteQuery<ObjectVO>(sqlQuery);

我知道这不是最佳实践,也没有解决为什么我的 sql 查询和我的 linq 查询没有得到相同的结果集的问题,但之前的答案没有。

另一件事是我的查询变得复杂(新的业务逻辑要求)必须加入 7 个表并搜索最大日期和移动是其中的一些,所以现在将查询转换为 linq to sql 更加复杂。

感谢您的支持。

【讨论】:

    【解决方案3】:

    这部分:

    var q1 =  from pe in db.PlazaEmpleados 
              where !db.PlazaEmpleados.Any
               (pe1 => 
    
                pe1.Id_plaza.Equals(pe.Id_plaza) && 
                pe1.Fecha > pe.Fecha &&
                pe1.Id_Emp != 0 && 
                pe1.Fecha < DateTime.Now
               ) 
              select pe;
    

    在 SQL 中,您首先使用 PlazaI,然后是 PlazaE——在 Linq 中,您两次都使用 PlazaEmpleados。

    【讨论】:

    • 我正在处理它,但我认为子查询的这一部分非常好,因为我试图在 db.PlazaE (PlazaEmpleados) PlazaEmpleados 中获取所有 pe 是我代码中的真实名称(对不起这),那部分是子查询不存在,。我认为这是错误的写它... :(
    【解决方案4】:

    将您的 SQL 查询放入存储过程并将其添加到上下文中。然后只需调用:

    var q = context.MyProcedure(new object[] {"value1","value2"});
    

    【讨论】:

    • 您的意思是声明一个新的存储过程并运行查询?这是不可能的,因为我无法在数据库中创建新的存储过程。或者你的意思是什么?
    • 我做了这样的事情,只是在使用存储过程的情况下,我使用了来自 linq 的“原始”查询。
    • 是的,我知道...我只是将自己的答案标记为正确:@迟到的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多