LINQ转换不会提供与SQL查询相同的结果

时间:2012-11-15 16:43:09

标签: sql linq linq-to-sql

大家好我有这个SQL查询(MSSQL),我正在进行一个查询,其中连接的结果给了我最新行的“顶部”行,没有重复的结果,你可以在这里找到的信息我正在做什么http://goo.gl/Uv0FR事情就是这样,我已经完成了SQL查询,正如我所期待的那样工作,我为每个IDKEY使用了一行“在哪里使用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 个答案:

答案 0 :(得分:6)

您对日期的检查有所不同:

LINQ:

pe1.Fecha > DateTime.Now

SQL:

pe1.Fecha < GETDATE()

你的LINQ不应该是:

pe1.Fecha < DateTime.Now

答案 1 :(得分:1)

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

db.ExecuteQuery<ObjectVO>(sqlQuery);

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

另一件事是我的查询增加了复杂性(新的业务逻辑要求)必须加入7表并搜索Max日期和移动是其中的一部分,所以现在将查询转换为linq到sql更复杂。

感谢您的支持。

答案 2 :(得分: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,然后在Linq使用PlazaE-,你们两次都使用PlazaEmpleados。

答案 3 :(得分:0)

将SQL查询放入存储过程并将其添加到上下文中。然后打电话:

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