2012-11-15 46 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

相關問題