【发布时间】:2014-04-16 08:19:16
【问题描述】:
我正在自学 Linq to entity,我有一个问题。看看下面的方法。它返回 List of WorkflowsInProgress 中每个项目的最新完成任务。此方法在我使用fields of TasksInProgress 的其他方法中被调用,但我也在使用the linked Tasks and WorkflowInProgress 的属性。如您所见,我已将Include 添加到查询中。
public List<TasksInProgress> GetLatestTaskForWorkflowsInProcess(List<WorkflowInProgress> pWorkflowsInProcess)
{
List<TasksInProgress> tasksLst = new List<TasksInProgress>();
List<Int64> workflowIds = pWorkflowsInProcess.Select(w => w.Id).ToList();
using (TaskWorkflowEntities myDatacontext = new TaskWorkflowEntities())
{
tasksLst = (from taskP in myDatacontext.TasksInProgress.Include("Tasks").Include("WorkflowInProgress")
where (taskP.RunningState == (int)WorkflowRunningStates.Completed) &&
workflowIds.Contains(taskP.WorkflowInProgressId) &&
taskP.Completed == (from sTaskP in myDatacontext.TasksInProgress
where sTaskP.WorkflowInProgressId == taskP.WorkflowInProgressId
group sTaskP by sTaskP.WorkflowInProgressId into gSTaskP
select gSTaskP.Max(g => g.Completed)).FirstOrDefault()
select taskP).ToList<TasksInProgress>();
}
return tasksLst;
}
我的问题是:
'有没有更优雅的方式在 Query 中包含其他表?' 因为我不喜欢那些硬编码的对象名只是坐在那里'(想象一下如果表名改变......)
或者还有其他方法可以用来包含链接对象/导航属性的字段吗?
注意:以上方法示例:
foreach(TasksInProgress taskInProc in _taskWorkflowS.GetLatestTaskForWorkflowsInProcess(currentWorkflowsInProcess))
{
//Do something with (int)taskInProc.Tasks.TaskOrder
//Do something with taskInProc.WorkflowInProgress.WorkflowId
// ...
//for Instance
int i = 0;
i = _taskWorkflowS.GetAmountOfTasksForWorkflow(taskInProc.WorkflowInProgress.WorkflowId, (int)taskInProc.Tasks.TaskOrder)
if (i > 0 )
{ ... }
}
更新:
使用 lambda 表达式作为 Include 的参数似乎不起作用,因为它只排除字符串(见下图):
【问题讨论】:
-
您使用的是哪个版本的实体框架?
-
EF 4.0 => 这是公司内部的最新分发版本。
-
那你必须使用@Alberto提出的解决方案。
标签: c# linq entity-framework