Ik heb het volgende stuk code:
Dit stuk code wordt in een User (ook een entity uit de database) uitgevoerd.
Een user heeft een reeks aan dagen in een Days tabel, vandaar dat ik zoek in this.Days
Dus de call gaat als volgt:
Het gekke is dat de query die wordt uitgevoerd door LINQ de volgende is:
Probleem: waarom neemt hij m'n Date niet mee?
In eerste instantie dacht ik dat hij het niet kreeg omgezet naar een db type dus ik ging hier zoeken:
http://msdn.microsoft.com/en-us/library/bb882657.aspx
Maar alles wat ik gebruik is ervoor bekend, dus alleen groter/gelijk en kleiner/gelijk worden gebruikt in mijn statement.
Dan ging ik verder zoeken, ik voerde de volgende code uit op de context zelf (dus niet in een userentity maar erbuiten):
En dit geeft de volgende SQL:
Waaraan heb ik dit gedrag te danken?
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| public List<Day> GetDays(int month, int year) { int daysInMonth = DateTime.DaysInMonth(year, month); DateTime min = new DateTime(year, month, 1); DateTime max = new DateTime(year, month, daysInMonth); //we cast to List so that it executes the query. //having it just in an IEnumerable doesn't do that //and then you get ~30+ calls in the next for block to the db return daysThatHaveData = (from day in this.Days where //not neccesary since we already are IN a user //day.UserID == this.UserID && day.Date >= min && day.Date <= max select day).ToList<Day>(); } |
Dit stuk code wordt in een User (ook een entity uit de database) uitgevoerd.
Een user heeft een reeks aan dagen in een Days tabel, vandaar dat ik zoek in this.Days
Dus de call gaat als volgt:
C#:
1
2
3
4
5
6
7
| User user = context.Users.SingleOrDefault(u => u.UserID == 1); if(null != user) { var list = user.GetDays(1, 2008); //doe iets met list } //... |
Het gekke is dat de query die wordt uitgevoerd door LINQ de volgende is:
SQL:
1
2
3
4
5
| SELECT [t0].[DayID], [t0].[Date], [t0].[WorkedHours], [t0].[UserID], [t0].[PeriodID], [t0].[Comment], [t0].[VacationHours], [t0].[SickHours] FROM [dbo].[Days] AS [t0] WHERE [t0].[UserID] = @p0 -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926 |
Probleem: waarom neemt hij m'n Date niet mee?
In eerste instantie dacht ik dat hij het niet kreeg omgezet naar een db type dus ik ging hier zoeken:
http://msdn.microsoft.com/en-us/library/bb882657.aspx
Maar alles wat ik gebruik is ervoor bekend, dus alleen groter/gelijk en kleiner/gelijk worden gebruikt in mijn statement.
Dan ging ik verder zoeken, ik voerde de volgende code uit op de context zelf (dus niet in een userentity maar erbuiten):
C#:
1
2
3
4
5
6
7
8
9
10
| DateTime min = new DateTime(2009, 1, 1); DateTime max = new DateTime(2009, 1, 30); List<Day> list = (from day in this.TimesheetModelDataContext.Days where day.UserID == this._user.UserID && day.Date >= min && day.Date <= max select day).ToList<Day>(); |
En dit geeft de volgende SQL:
SQL:
1
2
3
4
5
6
| SELECT [t0].[DayID], [t0].[Date], [t0].[WorkedHours], [t0].[UserID], [t0].[PeriodID], [t0].[Comment], [t0].[VacationHours], [t0].[SickHours] FROM [dbo].[Days] AS [t0] WHERE ([t0].[UserID] = @p0) AND ([t0].[Date] >= @p1) AND ([t0].[Date] <= @p2) -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- @p1: Input Date (Size = 0; Prec = 0; Scale = 0) [1/1/2009 12:00:00 AM] -- @p2: Input Date (Size = 0; Prec = 0; Scale = 0) [1/30/2009 12:00:00 AM] |
Waaraan heb ik dit gedrag te danken?
Going for adventure, lots of sun and a convertible! | GMT-8