2015-08-06 6 views
0

У меня есть список приложений. Каждое приложение может иметь или не иметь связанную с ним запись поддержки.VB.NET Linq Left Join using Query Syntax

Единственный способ, которым я могу присоединиться, - это взять название приложения и посмотреть, соответствует ли он LookupValue поддержки (продукта). Но чтобы получить это свойство, мне нужно отбросить его в поле FieldLookupValue. Когда нет связанной записи поддержки, это то, где ошибка нулевой ссылки возникает в .MoveNext() внутри запроса Linq. Ниже приведен пример того, что в настоящее время работает для приложений, имеющих связанную поддержку, но выдает ошибку, когда они этого не делают.

Dim q = 
    From a In apps.AsEnumerable() 
    Group Join s In support.AsEnumerable() 
    On a("Title").ToString() Equals CType(s("Product"), FieldLookupValue).LookupValue 
    Into Group 
    From ajs In Group.DefaultIfEmpty() 
    Select New With { 
     .Name = a("Title"), 
     .SupportEnd = IIf(ajs Is Nothing, Nothing, ajs("End")) 
    } 

Как можно сравнить анонимные типы в заявлении On? Кажется, я не могу получить синтаксис, или, возможно, это невозможно. Я чувствую, что может исправить ошибку нулевой ссылки. Моя неудачная попытка вернулась Равно не может сравнивать тип со значением типа

Dim q = 
    From a In apps.AsEnumerable() 
    Group Join s In support.AsEnumerable() 
    On 
    (New With {Key .AppName = a("Title").ToString()}) Equals 
    (New With {Key .AppName = IIf(s Is Nothing, "nada", CType(s("Product"), FieldLookupValue).LookupValue)}) 
    Into Group 
    From ajs In Group.DefaultIfEmpty() 
    Select New With { 
     .Name = a("Title"), 
     .SupportEnd = IIf(ajs("End") Is Nothing, Nothing, ajs("End")) 
    } 

Любые идеи о том, как получить это присоединиться к работе, используя один из двух неудачных методов выше было бы здорово.

ответ

0

Как только я создал фиктивный объект по умолчанию на основе случайного выбора из списка поддержки (я выбрал индекс 0), я использовал это для сравнения с показанным. Затем просто использовал оператор Let, чтобы иметь логическое легкодоступное при выборе.

Dim q = 
    From a In apps.AsEnumerable() 
    Group Join s In support.AsEnumerable() 
    On a("Title").ToString() Equals CType(s("Product"), FieldLookupValue).LookupValue 
    Into Group 
    From ajs In Group.DefaultIfEmpty(support(0)) 
    Let NoSupport As Boolean = IIf(ajs.Equals(support(0)), True, False) 
    Select New With { 
     .Name = a("Title"), 
     .SupportEnd = IIf(NoSupport, "No Support", ajs("End")) 
    }