Выражение запроса с объединением для многокомпонентного ключа и нулевых значений

#f# #f#-3.0 #query-expressions

#f# #f #-3.0 #запрос-выражения

Вопрос:

Рассмотрим следующие две таблицы по 3 столбца в каждой:

Таблица 1:

 a INTEGER NOT NULL,
b INTEGER NOT NULL,
c INTEGER NOT NULL
  

Таблица 2:

 d INTEGER NOT NULL,
e INTEGER,
f INTEGER NOT NULL
  

Я пытаюсь написать выражение запроса, которое объединяет две таблицы по составному ключу из 2 частей : (b, c) = (e, f) .

Я знаю, что если бы столбца e не Nullable было, я мог бы просто написать:

 query {
    for r1 in c.table1 do
    join r2 in c.table2 on ((r1.b, r1.c) = (r2.e, r2.f))
    .
    .
}
  

Но как мне это сделать, если столбец e есть Nullable , а столбец b нет?

Комментарии:

1. Выстрел в темноте, но что произойдет, если вы попробуете r2.e.Value вместо r2.e того, чтобы внутри кортежа?

2. Ну, я думаю то же самое, что и я ((Nullable(r1.b), r1.c) = (r2.e, r2.f)) : в основном исключение, если r2.e есть Null . Я думаю, что нам здесь нужен Nullable тип кортежа, чтобы ?= его можно было использовать.

3. Какое исключение вы видите используемым Nullable(r1.b) ? Это не должно быть исключением с нулевой ссылкой, поскольку сравнения на равенство допустимы даже для нулевых значений.

4. @kvb: Это InvalidOperationException .

5. Мне жаль, что это моя ошибка. Исключение возникает из-за того, что я вызываю head исключение запроса после объединения, а последовательность пуста. Так что, я думаю Nullable(r1.b) , действительно работает.