2011-05-19 132 views
1

我对linq很陌生,我在LINQ中有效地编写此查询时遇到了一些困难。将此SQL语句转换为LINQ

SELECT ID, UniqueID, RouteHeaderID, RouteObjectState, OriginalRouteUniqueID 
FROM dbo.MeterReadingOrderERPRouteCreateResponses 
WHERE (ID NOT IN (SELECT MeterReadingOrderERPRouteCreateResponseID 
        FROM dbo.Tasks 
        WHERE (TaskType = 'MeterReading'))) 

请帮忙吗?我试过这个解决方案:How would you do a "not in" query with LINQ?,但出现以下错误:无法创建类型'TaskManager.Models.Task'的常量值。在此上下文中仅支持基本类型(如Int32,String和Guid)。

回答

2
var meterReadingTasks = from task in context.Tasks 
         where task.TaskType == "MeterReading" 
         select task.MeterReadingOrderERPRouteCreateResponseID; 

var results = from m in context.MeterReadingOrderERPRouteCreateResponses 
       where !meterReadingTasks.Contains(m.Id) 
       select new { m.ID, m.UniqueID, m.RouteHeaderID, m.RouteObjectState, m.OriginalRouteUniqueID}; 
+0

嗨巴拉河试过了,它的作品完美。感谢你及时的答复 – 2011-05-20 06:45:59

3

只是这样做了我的头顶,但也许这?

var subQuery = from t in Tasks 
       where t.TaskType == "MeterReading" 
       select t.MeterReadingOrderERPRouteCreateResponseID 

var query = from m in MeterReadingOrderERPRouteCreateResponses 
      where !subQuery.Contains(m.ID) 
      select new 
      { 
       ID = m.ID, 
       UniqueID = m.UniqueID, 
       RouteHeaderID = m.RouteHeaderID, 
       RouteObjectState = m.RouteObjectState, 
       OriginalRouteUniqueID = m.OriginalRouteUniqueID 
      };