2010-12-21 79 views
0

我希望對於任何擅長Linq的人來說,這將是一個相當簡單的問題。我努力爲以下內容提出正確的Linq表達式。我能夠破解一些東西來獲得結果,但我確信有一個正確和簡單的Linq方式來做到這一點,我只是不夠Linq尚未...已過濾收集的集合的Linq表達式?

我有一個數據庫訪問通過實體框架。它有許多任務。每個任務都有一個TimeSegments集合。 TimeSegments具有日期和員工屬性。

我想要的是能夠獲取某個員工和某個月的任務以及同一月份和員工的每個任務的時間段。

同樣,這些任務本身並不具有月份和日期信息,但它們通過與每個任務相關的時間段來完成。

非常簡單,它看起來有點像這樣:

public class Model //Simplified representation of the Entity Framework model 
    { 
     public List<Task> Tasks { get; set; } 
    } 

    public class Task 
    { 
     public int Id { get; set; } 
     public List<TimeSegment> TimeSegments { get; set; } 
     public Customer Customer { get; set; } 
    } 

    public class TimeSegment 
    { 
     public int Id { get; set; } 
     public string Date { get; set; } 
     public Employee Employee { get; set; } 
    } 

    public class Employee 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

那麼,如何做到這一點儘可能簡單地使用LINQ?即任務以及某個月和員工的相關時間段。我也希望能夠通過客戶BTW得到它...

回答

2

這是最簡單的事情我能想出:

var tasksWithSegments = 
    from segment in model.TimeSegments 
    where segment.Date.Month == month 
    where segment.Employee.Id == employeeId 
    group segment by segment.Task into result 
    select new 
    { 
     Task = result.Key, 
     TimeSegments = result.ToArray() 
    }; 

請注意,你可能有一些屬性添加到您的模型,如Model.TimeSegmentTimeSegment.Task

LINQ查詢的訣竅通常是從正確的集合開始。在這種情況下,理想的起點是TimeSegments

ps。我不確定Date.Month == month是否可以與EF一起工作,但我認爲它會(與EF 4.0一樣)。


更新:

能告訴你如何延長這一 查詢並獲得任務以後 特定客戶呢?

我不知道你的意思,但你可以例如過濾以前可查詢這樣的:

var tasksWithSegmentsForCustomers = 
    from taskWithSegments in tasksWithSegments 
    where taskWithSegments.Task.Customer.Id == customerId 
    select taskWithSegments; 

我能得到的返回類型與任務列表 如果我在一個方法中有這個時間段的列表 ?

同樣,不知道你到底想要什麼,但如果你想有沒有關係的兩個單獨的列表,你可以這樣做:

List<Task> tasks = (
    from taskWithSegments in tasksWithSegments 
    select taskWithSegments.Task).ToList(); 

List<TimeSegments> segments = (
    from taskWithSegments in tasksWithSegments 
    from segment in taskWithSegments.Segments 
    select segment).ToList(); 

當然,如果這是你需要什麼,比它可能是更容易的原始查詢改寫爲這樣的事:

List<TimeSegment> segments = (
    from segment in model.TimeSegments 
    where segment.Date.Month == month 
    where segment.Employee.Id == employeeId 
    select segment).ToList(); 

List<Task> allTasks = 
    segments.Select(s => s.Task).Distinct().ToList(); 

一旦你得到了編寫LINQ查詢的竅門,也沒有辦法,你要回去編寫SQL語句或舊時尚的foreach語句。

認爲LINQ!

1

我要的是能夠得到一定僱員 任務和 某些月份和timesegments爲 每個任務同一個月和 員工。

這會從模型的實例,可在任務至少有一個時間段,在爲請求的員工(未經測試)所要求的每月選擇任務:

Model model = new Model(); 
tasks = model.Tasks.Where(t => t.TimeSegments.Any(ts => ts.Employee.Id = requestedId && Convert.ToDate(ts.Date).Month == requestedMonth)); 
+0

+1 - 打敗我吧。 – RPM1984 2010-12-21 22:34:57

+0

好的,但這隻會選擇包含這些時間段的任務,然後選擇這些任務,對不對?這意味着結果中的選定任務將包含所有時間段,即使那些不符合Any表達式測試的時間段也是如此......我只需要包含那些時間段的任務,並且只包含測試的時間段。 – Anders 2010-12-21 23:40:11