2013-02-28 135 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