2012-11-15 44 views
2

嗨,大家好我有这个SQL查询(MSSQL),我正在做一个查询,其中连接的结果是给我的“最高”行最新行日期没有重复的结果,你可以在这里找到我在做什么的信息http://goo.gl/Uv0FR事情是这样的,我已经完成了SQL查询,正在工作,因为我期待,我得到每行IDKEY使用1行不重复的条款“(‘’,‘’),其中pi.PlazaIe在LINQ翻译不会给出与我的SQL查询相同的结果

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只是不能对发生的事。(I” m在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 Query,或者指出错误在哪里。

在此先感谢。

+0

使用** [sqltolinq](http://www.sqltolinq.com/)**将sql查询转换为linq表达式 –

+0

检查我编辑的帖子。我增加了另一个解 – CSharpie

回答

1

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

db.ExecuteQuery<ObjectVO>(sqlQuery); 

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

另一件事是我的查询增长的复杂性(新的业务逻辑需求)必须加入7表和搜索最大日期和运动是其中的一些,所以现在是更复杂的转换查询到LINQ到SQL 。

感谢您的支持。

6

您的日期检查不同的是:

LINQ:

pe1.Fecha > DateTime.Now 

SQL:

pe1.Fecha < GETDATE() 

心不是你的LINQ应该是:

pe1.Fecha < DateTime.Now 
+0

+1靶心... –

+0

检查...如果这样可以解决问题 – ncubica

+0

尽管这确实是一个“错误”,但我仍然在Linq中使用重复行,并且正在使用SQL。我会尝试sqltolinq,看看发生了什么.. – ncubica

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。

+0

即时通讯工作,但我认为这部分子查询是相当好的,因为即时通讯试图让所有pe在db.PlazaE(PlazaEmpleados)PlazaEmpleados是我的代码中的真实姓名(对不起),该部分是子查询NOT EXIST。我认为是错误的写下了...... :( – ncubica

0

将您的SQL查询存储到存储过程并将其添加到上下文中。然后,只需拨打:

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

你的意思是声明一个新的存储过程并运行查询?,这不是因为我不能在数据库中创建新的存储过程,或者你是什么意思? – ncubica

+0

I做了这样的事情,只是在使用存储过程时,我使用了linq的“原始”查询。 – ncubica

+0

是的,我知道......我只是将自己的答案标记为正确:@迟到答案 – ncubica

相关问题