簡體   English   中英

Linq to Entities 4.0(“包含”):尋找一種優雅的方式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM