I’ve tried every translation service under the sun to get this syntax right but I still get “Overload resolution failed because no accessible ‘SelectMany’ can be called with these arguments”
on the first part of the select statement (up to the full stop just before the groupby keyword)
the original c# statement from an online example I’m trying to get working locally:
public IEnumerable<TagGroup> GetTagGroups()
{
var tagGroups =
// extract the delimited tags string and session id from all sessions
DbSet.Select(s => new { s.Tags, s.Id })
.ToArray() // we'll process them in memory.
// split the "Tags" string into individual tags
// and flatten into {tag, id} pairs
.SelectMany(
s =>
s.Tags.Split(_tagDelimiter, StringSplitOptions.RemoveEmptyEntries)
.Select(t => new { Tag = t, s.Id })
)
// group {tag, id} by tag into unique {tag, [session-id-array]}
.GroupBy(g => g.Tag, data => data.Id)
// project the group into TagGroup instances
// ensuring that ids array in each array are unique
.Select(tg => new TagGroup
{
Tag = tg.Key,
Ids = tg.Distinct().ToArray(),
})
.OrderBy(tg => tg.Tag);
return tagGroups;
}
The closest I’ve come to it in VB:
Public Function GetTagGroups() As IEnumerable(Of TagGroup)
' extract the delimited tags string and session id from all sessions
' we'll process them in memory.
' split the "Tags" string into individual tags
' and flatten into {tag, id} pairs
' group {tag, id} by tag into unique {tag, [session-id-array]}
' project the group into TagGroup instances
' ensuring that ids array in each array are unique
Dim tagGroups = DbSet.[Select](Function(s) New With { _
s.Tags, _
s.Id _
}).ToArray().SelectMany(Function(s) s.Tags.Split(_tagDelimiter, StringSplitOptions.RemoveEmptyEntries).[Select](Function(t) New With { _
Key .Tag = t, _
s.Id _
})).GroupBy(Function(g) g.Tag, Function(data) data.Id).[Select](Function(tg) New With { _
Key .Tag = tg.Key, _
Key .Ids = tg.Distinct().ToArray() _
}).OrderBy(Function(tg) tg.Tag)
Return tagGroups
End Function
This results in the visual studio 2012 intellisense underlining in blue the first part of the statement from “DbSet” on the first line through to the last parenthesis before the “.GroupBy” near the bottom. The error is “Overload resolution failed because no accessible ‘SelectMany’ can be called with these arguments”.
As it’s a code example I’m trying to convert to vb to run locally and understand and I’m not experienced enough with linq I’m completely at a loss of how to try and deal with this. It’s way beyond my current understanding so could be a simple syntax error or a complete hash from start to finish for all I know!
Would be very grateful for any pointers.
I have now put this in VS2k8, and as well as the two simple issues with the VB sample I previously noted:
New Withconstructs must specify.<field> =AFAIK, andNew Withshould not be anonymous.I now also note these are the declarations I needed to get the code to not have errors. Other than adding intermediate query variables (which BTW mean you could thread the C# comments back in), I don’t recall actually changing the code further. Note the
_tagDelimiteras aChar()— what did the C# code declare it as? (Looking at theString.Splitoverloads that mentionStringSplitOptionsit has to beChar()orString()or C# is implicitly changing types somewhere that VB.NET doesn’t.)