2

大家好,我有这个 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 查询,或者指出错误在哪里。

提前致谢。

4

4 回答 4

6

您对日期的检查不同:

林克:

pe1.Fecha > DateTime.Now

SQL:

pe1.Fecha < GETDATE()

您的 LINQ 不应该是:

pe1.Fecha < DateTime.Now
于 2012-11-22T17:22:32.970 回答
1

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

db.ExecuteQuery<ObjectVO>(sqlQuery);

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

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

感谢您的支持。

于 2012-11-28T18:13:52.420 回答
0

这部分:

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。

于 2012-11-23T14:27:13.780 回答
0

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

var q = context.MyProcedure(new object[] {"value1","value2"});
于 2012-11-25T09:43:49.580 回答