我正在尝试将以下SQL转换为Entity Framework Core predicatebuilder。
我有3个表:“活动”,“工作流程”,“申请人”。
Activity
已与WorkFlow
上的WorkflowID
联接在一起,但是没有外键约束。WorkFlow
包含一个主要的WorkFlowID
和一个ParentWorkFlowID
,它只是一个普通列,还具有工作流ID。WorkFlow
具有ApplicantId
作为外键约束。Applicant
与任何其他表没有关系键我正在使用PredicateBuilder生成以下查询,但是不能。
SELECT
wp.ApplicantID
,cra.ActivityID
,cra.[WorkflowID]
,cra.[Employed] as IsEmployed
,cra.[SelfEmployed] as IsSelfEmployed
,[BusName] as BusinessName
FROM
[dbo].[dActivity] cra
INNER JOIN
[dbo].[Workflow] wp ON (wp.ParentWorkflowID = cra.WorkflowID
AND wp.ApplicantID IN (1234, 5678))
实体类:
public class ActivityEntity
{
[Key]
public int? ActivityID { get; set; }
public int? WorkflowID { get; set; }
public WorkFlowEntity WorkflowProcess { get; set; }
public bool? Employed { get; set; }
public bool? SelfEmployed { get; set; }
public string BusName { get; set; }
public string BusAddress { get; set; }
public bool? BusActive { get; set; }
}
public class WorkFlowProcessEntity
{
[Key]
public int? WorkflowID { get; set; }
public IEnumerable<ApplicantEntity> Applicants { get; set; }
public int? ParentWorkflowID { get; set; }
public int? K2ProcessInstanceID { get; set; }
public int? OutcomeTypeID { get; set; }
}
public class ApplicantEntity
{
[Key]
public int? ApplicantID { get; set; }
public string Firstname { get; set; }
public string Middlename { get; set; }
public string FirstnameSoundex { get; set; }
public string SurnameSoundex { get; set; }
public string MiddlenameSoundex { get; set; }
public int? TitleID { get; set; }
}
Repository.cs:
public Task<List<ActivityEntity>> FindActivities(RequestModel requestModel)
{
IQueryable<ActivityEntity> query = _dbContext.Activity;
var builder = PredicateBuilder.New<ActivityEntity>();
if (requestModel.SearchCriteria?.ApplicantIds.Count > 0)
{
// This doesn't work
builder.And(v => v.WorkflowProcess.Applicants.Any(a => requestModel.SearchCriteria.ApplicantIds.Contains(a.ApplicantID)));
}
// Where
// order
// Offset
// Limit
query = query.Where(builder);
return query.OrderBy(a => a.ActivityID).AsExpandable().ToListAsync();
}
这是我从SQL Server Profiler得到的响应:
exec sp_executesql N'SELECT [t].[ActivityID], [t].[ApplicantTypeID], [t].[BusActive], [t].[BusAddress], [t].[BusName], [t].[WorkflowProcessID]
FROM (
SELECT TOP(@__p_2) [x].[ActivityID], [x].[ApplicantTypeID], [x].[BusActive], [x].[BusAddress], [x].[BusName], [x].[WorkflowProcessID]
FROM [dbo].[Activity] AS [x]
LEFT JOIN [dbo].[Workflow] AS [x.Workflow] ON [x].[WorkflowID] = [x.Workflow].[WorkflowID]
WHERE ([x].[IsActive] = @__requestModel_SearchCriteria_IsActiveActivity_0) AND EXISTS (
SELECT 1
FROM [dbo].[Applicant] AS [a]
WHERE [a].[ApplicantID] IN (782094) AND ([x.Workflow].[WorkflowID] = [a].[WorkFlowEntityWorkflowID]))
) AS [t]
ORDER BY [t].[ActivityID]',N'@__p_2 int,@__requestModel_SearchCriteria_IsActiveActivity_0 bit',@__p_2=20,@__requestModel_SearchCriteria_IsActiveActivity_0=1