2011-07-22 64 views
2

有什麼辦法可以將以下SQL語句轉換爲LINQ嗎?如何將多個SQL LEFT JOIN語句與where子句轉換爲LINQ

select ve.EntityID 
     , fin1.FinanceStat as FinanceStat_New 
     , fin2.FinanceStat as FinanceStat_Old 
    from ValuationEvents_PIT_New as ve 
    left join FinStat_New as Fin1 
    on ve.EntityID = Fin1.EntityID 
    left join FinStat_Old as Fin2 
    on ve.EntityID = Fin2.EntityID 
    where Fin1.FinanceStat ne Fin2.FinanceStat 
     and Fin2.FinanceStat is not null 
     and charindex(Fin1.FinanceStat, 'abc') < 1 
     and charindex(Fin1.FinanceStat, 'xyz') < 1 

這是我的版本,但我需要額外的眼睛來看看它。

var result = (from ve in valuationEventsPit 
     join fsn in finStatNew on ve.EntityId equals fsn.EntityID into veFsn 
     from fin1 in veFsn.DefaultIfEmpty() 
     join fso in finStatOld on ve.EntityId equals fso.EntityID into veFso 
     from fin2 in veFso.DefaultIfEmpty() 
     select new 
     { 
      ve.EntityId, 
      FinStatNew1 = fin1 == null ? null : fin1.FinanceStat, 
      FinStatNew2 = fin2 == null ? null : fin2.FinanceStat 
     }). 
     Where(x => x.FinStatNew1 != null && 
      x.FinStatNew2 != null && 
      x.FinStatNew1 != x.FinStatNew2 && 
      !(x.FinStatNew1.Contains("abc")) && 
      !(x.FinStatNew1.Contains("xyz"))).ToList(); 

我排除x.FinStatNew1原因==因爲CHARINDEX(Fin1.FinanceStat, 'ABC')< 1,這將始終返回0,如果x.FinStatNew1不是null 'ABC' 的空或'xyz'不存在,如果x.FinStatNew1爲null,則它將返回null,並且條件仍然爲false(null < 0)。

非常感謝您的幫助。

回答

2

我認爲你可以減少更多的查詢並重新排列一些事情,使其更具可讀性。在原有基礎上查詢,這些實際上是LINQ到對象的查詢,我想試試這個:

const string con1 = "abc"; 
const string con2 = "xyz"; 
var query = 
    from ve in valuationEventPit 
    join fsn in finStatNew on ve.EntityId equals fsn.EntityID 
    join fso in finStatOld on ve.EntityId equals fso.EntityID 
    let FinStatNew = fsn.FinanceStat 
    let FinStatOld = fso.FinanceStat 
    where FinStatNew != FinStatOld && FinStatOld != null 
     && new[]{con1,con2}.All(con => !FinStatNew.Contains(con)) 
    select new { ve.EntityId, FinStatNew, FinStatOld }; 

的左連接是沒有必要在這裏。由於您排除了空值,因此我們可以忽略它們,然後執行內部連接。

+0

感謝您的幫助。這不是LINQ to SQL或EF,這是LINQ to Objects,我必須檢查null,否則我會產生NullReferenceException。 –

+0

啊,在這種情況下,我們可以在這裏做更多的事情。我會更新。 –

+0

再次感謝。我看到你現在在使用Inner Join,因爲我這樣做了。我不確定我的翻譯是否正確,否則我不會要求提供建議:)。你是否仍然相信我的查詢正在執行內部連接,即使它正在使用左連接?請閱讀原始SQL而不是我的代碼。 –