2012-12-22 71 views
3

時拋出的異常我有,我檢索到的標識和名稱字段的表僱員:Linq查詢日期爲最近7天的不同的值,運行查詢

var users = context.Employees.ToList() 
        .Select(employee => new KeyValuePair<int, string>(employee.Id,employee.Name)); 

這部分工作得很好,我的問題是,還有另一個表考勤設置了外鍵,並且有一個字段LoginDate,它是一個DateTime值。用戶可以多次登錄,因此我想獲取用戶在過去7天內登錄的次數的明確值。

foreach (var user in users) 
{ 
    var days = context.Attendances.Where(x => x.Id == user.Key && x.LoginDate.Date > DateTime.Now.AddDays(-7)).Distinct().ToList(); 
    int count = days.Count(); 
    _attendanceTable.Rows.Add(user.Key, user.Value, count); 
} 

我收到的時候我在競選考勤表的查詢異常:

指定類型的成員「日期」在LINQ是不支持的實體。 僅支持初始值設定項,實體成員和實體導航屬性 。

回答

5

你可以做所有單查詢:

var date = DateTime.Now.AddDays(-7).Date; // I think you need date only here 
var query = from e in context.Employees 
      join a in context.Attendances on e.Id equals a.Id into g 
      select new 
      { 
       e.Id, 
       e.Name, 
       Count = g.Where(x => x.LoginDate > date) 
         .GroupBy(x = > new { 
           x.LoginDate.Year, 
           x.LoginDate.Month, 
           x.LoginDate.Day 
          }).Count() 
      }; 

foreach(var user in query) 
    _attendanceTable.Rows.Add(user.Id, user.Name, user.Count); 

同樣的日期時間Date財產不被支持的EntityFramework。您應該使用匿名對象來按日期分組參加。

生成的SQL查詢將如下所示:

SELECT [Extent1].[Id] AS [Id], 
     [Extent1].[Name] AS [Name], 
    (SELECT 
     COUNT(1) AS [A1] 
     FROM (SELECT DISTINCT 
      DATEPART (year, [Extent2].[LoginDate]) AS [C1], 
      DATEPART (month, [Extent2].[LoginDate]) AS [C2], 
      DATEPART (day, [Extent2].[LoginDate]) AS [C2], 
      FROM [dbo].[Attendances] AS [Extent2] 
      WHERE [Extent1].[Id] = [Extent2].[Id] 
     ) AS [Distinct1]) AS [C1] 
FROM [dbo].[Employees] AS [Extent1] 
+0

太棒了,這個查詢很漂亮!你可以編輯你的文章,並簡要說明你的查詢過程。我已經選擇這個作爲最佳答案。非常感謝! – Shahnawaz

+1

@Shahnawaz第一部分是參加員工和求診(它是像左連接)。第二部分是子查詢加入人次'g'可過濾日期出勤,然後過濾組由求診年,月,日(順便說一句,你只能通過天團,如果您選擇上週人次) –

+1

非常感謝你的解釋。幫助很多。 – Shahnawaz

2

一些你可以在代碼中執行不翻譯(至少不乾淨),以SQL操作的,你需要讓他們更好地翻譯走動某些操作。

//Figure out the day you want in advance 
var sevenDaysAgo = DateTime.Now.Date.AddDays(-7); 
var results = users.Select(user => new { 
    user.Key, 
    user.Value, 
    Count = users.Join(context.Attendances, 
         user => user.Key, 
         attendance => attendance.EmployeeId, 
         (user, attendance) => attendance.LoginDate) 
        .Where(date => date > sevenDaysAgo) 
        .Select(date => date.Day) 
        .Distinct() 
        .Count() 
}); 

foreach (var result in results) 
{   
    _attendanceTable.Rows.Add(result.Key, result.Value, result.Count); 
} 
+0

這不是解決問題,我仍然得到此異常: 指定類型的成員「日期」不支持LINQ到實體。僅支持初始化程序,實體成員和實體導航屬性。 – Shahnawaz

+0

@Shahnawaz你改變了'x.LoginDate.Date'到'x.LoginDate'吧? – mlorbetske

+0

哦,是的,我現在改變了,每個員工都得到0天。 – Shahnawaz