2013-02-28 173 views
2

我有以下SQL語句需要幫助從SQL轉換到LINQ

select RegionBoundaryID, RegionBoundary.lat, RegionBoundary.long, RegionID 
from RegionBoundary join Region_Boundary on RegionBoundary.RegionBoundaryID = Region_Boundary.BoundaryID 
order by RegionID, RegionBoundaryID 

這裏是它的翻譯LINQ

var context = new DataClassesRegionDataContext(); 
var regionBoudaries = from boundaryID in context.Region_Boundaries 
         join boundariesDetail in context.RegionBoundaries on boundaryID.BoundaryID equals boundariesDetail.RegionBoundaryID 
         select new RegionViewModel { ID = boundariesDetail.RegionBoundaryID, Latitude = boundariesDetail.lat.Value, Longitude = [email protected], RegionID = boundaryID.RegionID }; 
regionBoudaries.OrderBy(region => region.RegionID).ThenBy(region => region.ID); 

不過,我從LINQ得到的結果是從SQL的不同聲明。 LINQ聲明中我錯了什麼地方?謝謝。

編輯:不同的是在加入順序我的結果出現

+1

有什麼不同?查詢是不同的還是結果? – jrummell 2013-02-28 17:49:11

+0

你得到的結果是完全不同還是隻是在排序? – 2013-02-28 17:50:57

+0

是的,這是區別:) – 2013-03-01 00:48:06

回答

2

這將產生相同的查詢:

var context = new DataClassesRegionDataContext(); 
var regionBoudaries = from rb in context.Region_Boundaries 
         join b in context.RegionBoundaries 
          on rb.BoundaryID equals b.RegionBoundaryID 
         orderby rb.RegionID, b.RegionBoundaryID // ordering here 
         select new RegionViewModel { 
          ID = b.RegionBoundaryID, 
          Latitude = b.lat.Value, // what if null? 
          Longitude = [email protected], // what if null? 
          RegionID = rb.RegionID 
         }; 

BTW表名和變量名是可怕的。兩個表格僅與下劃線不同!變量boundaryID的名稱看起來像一些整數(或其他標識類型)。

+0

1)感謝您對錶名稱的想法。 2)我已經將數據庫設置爲不允許在'lat'和'long'中爲null,這是否足夠?再次感謝 – 2013-03-01 00:46:42

+1

@MinhTriet我指出'lat'和'long',因爲它們當前都是可以爲空的值(即在數據庫中Null是可能的值)。如果兩者都不能爲空,那麼是的,讓它們在數據庫中是必需的,LINQ to SQL(或EF)將它們生成爲非空也 – 2013-03-01 07:02:56

2

一個問題是:OrderByThenBy訂購可枚舉,他們不修改底層的枚舉,所以你應該使用:

var regionBoudaries = from boundaryID in context.Region_Boundaries 
         join boundariesDetail in context.RegionBoundaries on boundaryID.BoundaryID equals boundariesDetail.RegionBoundaryID 
         select new RegionViewModel { ID = boundariesDetail.RegionBoundaryID, Latitude = boundariesDetail.lat.Value, Longitude = [email protected], RegionID = boundaryID.RegionID }; 
regionBoudaries = regionBoudaries.OrderBy(region => region.RegionID).ThenBy(region => region.ID); 
+0

這也適用。萬分感謝 – 2013-03-01 16:36:15