Этот простой, но злой запрос LINQ вызывает у меня проблемы во время выполнения (обратите внимание, что любое подходящее предложение where работает, пока я не использую JOIN:
var query = from iDay in db.DateTimeSlot
join tsk in db.Tasks on iDay.FkTask equals tsk.PkTask
join dte in db.Mdate on iDay.FkDate equals dte.PkDate
where dte.Mdate1 == day.ToString(dtForm)
select new {
tsk.PkTask,
tsk.Task,
iDay.FkTask,
iDay.TimeSlot,
iDay.Mdate,
dte.Mdate1
};
Я могу заставить работать выражение whereво время выполнения, но только в том случае, если он применяется к столбцу db.DateTimeSlot. В противном случае запрос будет работать, если я удалю предложение where. Если я попытаюсь использовать правильную причину, указанную здесь, я получу «Необработанное исключение:System.ArgumentException: значение не попадает в ошибку ожидаемого диапазона, когда я пытаюсь просмотреть результаты запроса var. Обратите внимание, что когда я удаляю предложения JOIN, предложение where действительно работает, когда я запрашиваю соответствующую таблицу.
Схема базы данных:
tasks -∞ dateTimeSlot ∞- mdate
Я пытаюсь получить список задач, связанных с определенным mdate.date, поэтому предложение where проверяет mdate.date.
Спасибо
РЕДАКТИРОВАТЬ: вот схема Sqlite DB для этой части:
CREATE TABLE mdate (
pkDate INTEGER PRIMARY KEY AUTOINCREMENT,
mdate TEXT,
nDay TEXT);
CREATE TABLE dateTimeSlot (
pkDTS INTEGER PRIMARY KEY AUTOINCREMENT,
timeSlot INTEGER,
fkDate INTEGER,
fkTask INTEGER,
FOREIGN KEY(fkDate) REFERENCES mdate(pkDate)
FOREIGN KEY(fkTask) REFERENCES tasks(pkTask));
CREATE TABLE mdate (
pkDate INTEGER PRIMARY KEY AUTOINCREMENT,
mdate TEXT,
nDay TEXT);
РЕДАКТИРОВАТЬ: Вот оператор SQL, который работает:
sqlite> SELECT tasks.task, mdate.mdate FROM dateTimeSlot
...> INNER JOIN tasks ON dateTimeSlot.fkTask=tasks.pkTask
...> INNER JOIN mdate ON dateTimeSlot.fkDate=mdate.pkDate
...> where mdate.mdate = '2011-07-21';
task|mdate
laundry|2011-07-21
laundry|2011-07-21
РЕДАКТИРОВАТЬ: Вот вывод Db.Log = Console.Out.Обратите внимание, что я не получаю этот SQL-спам, если оставлено предложение where, я получаю только обычный спам отладки исключений:
SELECT tsk$.[pkTask], tsk$.[task], iDay$.[fkTask], iDay$.[timeSlot], t1$.[mdate], t1$.[nDay], t1$.[pkDate], dte$.[mdate]
FROM [main].[dateTimeSlot] AS iDay$
LEFT JOIN [main].[mdate] AS t1$ ON t1$.[pkDate] = iDay$.[fkDate]
INNER JOIN [main].[mdate] AS dte$ ON iDay$.[fkDate] = dte$.[pkDate]
INNER JOIN [main].[tasks] AS tsk$ ON iDay$.[fkTask] = tsk$.[pkTask]
-- Context: SqlServer Model: AttributedMetaModel Build: 4.0.0.0
Я разместил полную ошибку по адресу: here
Решено!Я заменил day.ToString (dtForm) на: tDate tDate - это просто локальная строка = day.ToString (dtForm)