Вопрос по linq-to-sql, c#, linq – Int? и сравнение int когда LEFT OUTER JOIN в выпуске Linq

0

Я работаю над проектом WinForms, который требует использованияLinq-To-Sql, Я смог создать свой DataContext, используяSqlMetal инструмент, и сделать несколько запросов. Но сейчас у меня есть проблема, которую я не смог решить.

Я пытаюсь сделатьLEFT OUTER JOIN следующим образом:

MyDatabase db = new MyDatabase(...);

 var query = from p in db.ParentTable
             join t in db.ChildTable on new {A = p.child_ID, B = p.OtherID}
             equals new {A = t.ID, B = t.OtherID} into j1
             from c in j1.DefaultIfEmpty()
             select new
             {
                  ...
             };

Когда я пишу этот запрос, во время компиляции возникает ошибка вjoin слово:

Неверный тип одного из выражений в предложении соединения. Не удалось определить тип в вызовеGroupJoin'

Я знаю, что эта ошибка вызвана сравнениемp.child_ID а такжеt.ID посколькуp.child_ID являетсяint? а такжеt.ID являетсяint, Но,Как я могу решить это? Как я могу выполнитьLEFT OUTER JOIN без этой ошибки ??

p.child_ID являетсяint? так как этот столбец помечен какIS NULL в .SQL

Надеюсь, кто-нибудь может мне помочь, заранее спасибо.

Что если вы попробуете это ... на новом {p.child_ID.Value, ...} I 'Я не уверен, что это сработает. Randy Minder
буду искать?? оператор. Sam I am

Ваш Ответ

2   ответа
4

что имена свойств должны быть такими же, как указаноcasperOne ♦, но вторая проблема в том, что выпересматриваяобнуляемый-ИНТ,p.child_IDсненулевой-ИНТ,t.ID, Таким образом, вы могли бы использоватьнуль-коалесцирующий оператор в этом случае:

(int)(p.child_ID ?? default(int))

В этом случае возвращаетсяp.child_ID если нетт ноль еще возвращаетdefault(int), то есть .0

Запрос будет:

var query = from p in db.ParentTable
            join t in db.ChildTable on new {A = (int)(p.child_ID ?? default(T)), B = p.OtherID}
            equals new {A = t.ID, B = t.OtherID} into j1
            from c in j1.DefaultIfEmpty()
            select new
            {
               //...
            };
Благодарю. может быть сокращено как (p.child_ID ?? 0) Rm558
6

GetValueOrDefault () метод. Возвращает значение текущего объекта Nullable или объектазначение по умолчанию.

С точки зрения вашего примера:

var query = from p in db.ParentTable
            join t in db.ChildTable on new {A = p.child_ID.GetValueOrDefault(0), B = p.OtherID}
            equals new {A = t.ID, B = t.OtherID} into j1
            from c in j1.DefaultIfEmpty()
            select new
            {
                ...
            };

Если p.child_ID станет нулевым, он вернет 0. Надеюсь, это поможет !!

Похожие вопросы