[英]Linq to Entities 4.0 ('Include'): In search of an elegant way
我正在向实体学习Linq,我有一个问题。 看一下下面的方法。 它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;
}
我的问题是:
“是否有更优雅的方式在查询中包含其他表?” 因为我不喜欢只是坐在那里的那些硬编码对象名(想象一下,如果表名更改了...)
还是有其他方法可以用来包含链接对象/导航属性的字段?
注意:以上方法的示例:
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
参数似乎不起作用,原因是它仅排除字符串(参见下图):
编辑:将问题更改为Entity Framework 4.0之前的答案。 这仅适用于EF 4.1和更高版本
你可以有
.Include(o => o.Tasks)
如果您添加
using System.Data.Entity;
至少您当时没有使用字符串,并且如果表发生更改,您将得到错误
您可以编写使用lambda表达式而不是字符串的扩展方法:
public static ObjectQuery<T> Include<T>(this ObjectQuery<T> query, Expression<Func<T, object>> selector)
{
MemberExpression body = selector.Body as MemberExpression;
return query.Include(body.Member.Name);
}
并像这样使用它:
myDatacontext.TasksInProgress.Include(q=>q.Tasks)
.Include(q=>q.WorkflowInProgress)
我没有测试过,但是应该可以。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.