Je suis en train d'essayer F# 3.0 et je me heurte à un mur lorsqu'il s'agit de regrouper par plusieurs colonnes. La chose évidente à essayer était
query {
for d in context.table do
groupBy (d.col1,d.col2) into g
select (g.Key)
}
Mais je reçois une exception "Only parameterless constructors and initializers are supported in LINQ to Entities".
Je n'arrive pas à trouver un exemple sur msdn.
http://msdn.microsoft.com/en-us/library/hh225374(v=vs.110).aspx
http://msdn.microsoft.com/en-us/library/hh361035(v=vs.110).aspx
Et je réalise que ma question est similaire à " Entity Framework et types anonymes en F# "mais il semble que ce problème soit lié à powerpack/F#2.x et j'espère que F# 3.0 a une réponse élégante... Des idées ?
UPDATE :
J'ai découvert l'attribut CLIMutable en lisant le billet de Brian sur le site :
http://blogs.msdn.com/b/fsharpteam/archive/2012/07/19/more-about-fsharp-3.0-language-features.aspx
J'étais plutôt optimiste alors j'ai essayé
[<CLIMutable>]
type MyRecord = { Column1 : int; Column2 : int }
query {
for d in context.table do
groupBy {Column1 = col1; Column2 = col2} into g
select (g.Key)
}
Malheureusement, j'obtiens exactement la même exception.
0 votes
Est-ce que le problème est que tu regroupes sur un tuple, ou bien que tu en sélectionnant un ? L'erreur semble concerner le type de "sortie". Peut-être que sélectionner
g.Count()
à la place et voir ce qui se passe. Je n'ai pas essayé la version 3.0... je ne fais que supposer.0 votes
J'ai essayé de sélectionner une constante "select (1)" et j'ai obtenu la même chose.
0 votes
@ildjarn :
g.Key
est un tuple, qui n'a pas de constructeur sans paramètre.select 1
devrait cependant fonctionner, si ma supposition est correcte.0 votes
@Daniel :
select g.Key
n'est pas construire ou initialiser un nouveau tuple, cependant. AFAICT,select (g.Key)
serait unTuple<Tuple<col1_t, col2_t>>
qui invoque le constructeur deTuple<'T1>
;select g.Key
serait unTuple<col1_t, col2_t>
en réutilisant une valeur existante au lieu d'en initialiser une nouvelle. Bien sûr, je pars du principe que l'exception est causée par la fonctionselect
plutôt que legroupBy
ce qui peut être totalement faux. :-P0 votes
@ildjarn : Je peux me tromper, mais j'ai supposé que la sortie serait
Tuple<_,_>
puisqu'il se regroupe sur(d.col1,d.col2)
et en sélectionnant la clé. Il semble que LINQ n'ait aucun moyen d'instancier un tel type. Est-ce que le type de la requête n'est pas déterminé parselect
comme en C# ?0 votes
@Daniel : Tout ce que j'ai dit n'est que pure spéculation -- je n'ai aucune idée de la façon dont les bits de F#3 fonctionnent (ou sont supposés fonctionner) :-].
0 votes
J'ai d'abord vérifié "select (1)" dans d'autres contextes pour m'assurer que ce n'était pas un problème en soi. Mais j'ai quand même essayé "select 1" et "select g.Key" et j'ai obtenu le même résultat.
3 votes
La parenthèse est juste pour le regroupement. Ce sont les virgules qui en font un tuple. Un tuple avec un seul élément est saisi comme (1,)