将SQL转换为LINQ到Entities语句的问题

时间:2012-02-10 18:28:21

标签: sql linq entity-framework

我们正在将SQL /存储过程转换为LINQ to Entities语句。

目前我正在转换此SQL:

declare @startDate DateTime
set @startDate = DATEADD(DD, -30, GETDATE())

select h.*
from  History h (nolock) 
  inner join Quote q (nolock) on h.QuoteID = q.QuoteID 
  inner join Agency (nolock) a on q.AgencyID = a.AgencyID
  inner join DC_PLT_EntityRoles er (nolock) on a.AgencyID = er.EntityID
  inner join DC_PLT_Roles (nolock) r on er.RoleID = r.RoleID
where
  q.Status = 'Inforce' 
  and q.LOB = 'Vacant'  
  and q.EffectiveDate > @startDate 
  and h.Deleted is null 
  and h.DeprecatedBy is null 
  and h.TransactionStatus = 'Committed'
  and r.Name = 'Wholesaler'

这是我写的LINQ to Entities:

var startDate = DateTime.Today.AddDays(-30);    
var results = (from h in Histories
       .Include("Quote")
       .Include("Quote.Agency")
       .Include("Quote.Agency.DC_PLT_Roles")
   where h.Quote.Status == "Inforce" &&  
              h.Quote.LOB == "Vacant" &&        
              h.Quote.EffectiveDate > startDate &&
              h.Deleted == null &&
              h.DeprecatedBy == null &&
              h.TransactionStatus == "Committed" && 
              h.Quote.Agency.DC_PLT_Roles.All(r => r.Name == "Wholesaler")
   select h).ToList();

问题是SQL返回77行而我的LINQ没有返回。

任何人对如何正确转换这个有任何想法?或者我错过了什么。

感谢您的帮助。

R

2 个答案:

答案 0 :(得分:1)

h.Quote.Agency.DC_PLT_Roles.All(r => r.Name == "Wholesaler")

我认为这一行是你的问题。我很确定你想在这里使用Any All。在这种情况下,All表示代理商的所有DC_PLT_Roles必须具有Name == "Wholesaler"Any表示代理商必须有一个DC_PLT_Role Name == "Wholesaler"

答案 1 :(得分:0)

您可能还想查看关于(nolock)语句的内容:

http://www.hanselman.com/blog/GettingLINQToSQLAndLINQToEntitiesToUseNOLOCK.aspx