public static Tuple<ExpressionSyntax, Func<IdentifierNameSyntax, ExpressionSyntax>> GetNullabledQueryAndValueGetter(TypeSymbol itemType, SyntaxToken iterator, ExpressionSyntax collection) { if (!itemType.IsReferenceType && itemType.SpecialType != SpecialType.System_Nullable_T) { //wrap it in Nullable<T> return Tuple.Create<ExpressionSyntax, Func<IdentifierNameSyntax, ExpressionSyntax>>( collection.Accessing(Syntax.Identifier("Cast").Genericed(itemType.Name.AsIdentifier().Nullable())).Invoking(), e => e.Accessing("Value")); } //wrap it in Tuple<T> var wrappedRead = Syntax.IdentifierName("Tuple").Accessing("Create").Invoking(Syntax.IdentifierName(iterator).Args1()); return Tuple.Create<ExpressionSyntax, Func<IdentifierNameSyntax, ExpressionSyntax>>( collection.Accessing("Select").Invoking(iterator.Lambdad(wrappedRead).Args1()), e => e.Accessing("Item1")); }