3 Таблица LINQ-запрос с предложением where - PullRequest
3 голосов
/ 22 июля 2011

Этот простой, но злой запрос 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)

Ответы [ 2 ]

2 голосов
/ 22 июля 2011

Ваш вывод исключений подчеркивает проблему, поскольку используемый вами провайдер L2S не может преобразовать day.ToString(dtForm) в какую-либо понятную форму для SQLite.

Приятно то, что это в основном фиксированная строка для запроса и не зависит ни от чего. Вам придется удалить его из запроса, но просто поднять его до локальной переменной:

var mdate1 = day.ToString(dtForm);
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 == mdate1
   select new
   {
      tsk.PkTask,
      tsk.Task,
      iDay.FkTask,
      iDay.TimeSlot,
      iDay.Mdate,
      dte.Mdate1
   };

Соответствующей частью исключения является бит AnalyzeToString, указывающий вам в этом направлении:

Unhandled Exception: System.ArgumentException: Value does not fall within the expected range.
  at DbLinq.Data.Linq.Sugar.Implementation.ExpressionDispatcher.AnalyzeToString (System.Reflection.MethodInfo method, IList`1 parameters, DbLinq.Data.Linq.Sugar.BuilderContext builderContext) [0x00151] in /var/tmp/portage/dev-lang/mono-2.10.2-r1/work/mono-2.10.2/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.Analyzer.cs:466 
  at DbLinq.Data.Linq.Sugar.Implementation.ExpressionDispatcher.AnalyzeUnknownCall (System.Linq.Expressions.MethodCallExpression expression, IList`1 parameters, DbLinq.Data.Linq.Sugar.BuilderContext builderContext) [0x0008d] in /var/tmp/portage/dev-lang/mono-2.10.2-r1/work/mono-2.10.2/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.Analyzer.cs:345 
  at DbLinq.Data.Linq.Sugar.Implementation.ExpressionDispatcher.AnalyzeCall (System.Linq.Expressions.MethodCallExpression expression, IList`1 parameters, DbLinq.Data.Linq.Sugar.BuilderContext builderContext) [0x00040] in /var/tmp/portage/dev-lang/mono-2.10.2-r1/work/mono-2.10.2/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.Analyzer.cs:178
0 голосов
/ 22 июля 2011

Evan:

Интересно, какое значение принимает day.ToString(dtForm)? Это дата до 1 января 1753 года? Если это так, SQL Server не примет это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...