[RESOLU] Sqlite4Unity3d: jointure de tables

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6265
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

[RESOLU] Sqlite4Unity3d: jointure de tables

Message par boubouk50 » 06 Juin 2016 11:17

Sali Salut, les voisinous! (Ned sort de ce corps!)

Je galère à comprendre le système de jointure de tables avec SQLite et j'aurai besoin d'un coup de pouce (olives, s'abstenir).
Je vous mets un screen de la fonction en question. Je ne comprends pas les arguments de la jointure, les delegates.

Image

Code : Tout sélectionner

_connection.Table <Produit>().Join (_connection.Table <Collection_Produit> (),
		            pID => pID.ID, cpID => cpID.IDProduit, (pID, cpID) => new { CollID = cpID.IDCollection, ProdCollID = pID, Nom = pID.Nom });
La requête qui doit être réalisée au finale est celle-ci (merci Dragonic):
SELECT * FROM Produit p JOIN Collection_Produit ep ON p.ID=ep.IDProduit JOIN Collection e ON e.ID=ep.IDCollection WHERE e.Nom LIKE "Centrale";

Pour l'instant, comme vous le voyez, je ne cherche qu'à réaliser la première jointure (même si la requête est fausse en l'état) et comprendre pourquoi et comment j'utilise les arguments de la fonction Join ().

Merci à vous.
Boubouk.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6265
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [MY - AL] Sqlite4Unity3d: jointure de tables

Message par boubouk50 » 06 Juin 2016 11:19

J'oubliais:

Code : Tout sélectionner

public TableQuery<TResult> Join<TInner, TKey, TResult> (
			TableQuery<TInner> inner,
			Expression<Func<T, TKey>> outerKeySelector,
			Expression<Func<TInner, TKey>> innerKeySelector,
			Expression<Func<T, TInner, TResult>> resultSelector)
		{
			var q = new TableQuery<TResult> (Connection, Connection.GetMapping (typeof (TResult))) {
				_joinOuter = this,
				_joinOuterKeySelector = outerKeySelector,
				_joinInner = inner,
				_joinInnerKeySelector = innerKeySelector,
				_joinSelector = resultSelector,
			};
			return q;
		}
J'ai trouvé un exemple, mais je ne pige pas tout encore:
https://msdn.microsoft.com/fr-fr/librar ... .110).aspx
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6265
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [MY - AL] Sqlite4Unity3d: jointure de tables

Message par boubouk50 » 06 Juin 2016 14:58

Voilà ce à quoi j'en suis rendu pour le moment:

Code : Tout sélectionner

var query = _connection.Table <Produit>().Join (_connection.Table <Collection_Produit> (),
		            pID => pID.ID, cpID => cpID.IDProduit, (pID, cpID) => new { Collection = cpID, Produit = pID}).Join (_connection.Table <Collection> (),
		                        cpID => cpID.Collection.IDCollection, cID => cID.ID, (cpID, cID) => new { Collection = cID, CollectionProduit = cpID }).Where (result => result.CollectionProduit.Produit.Nom == collection);

		IEnumerable <Produit> table = query.Select (x => x.CollectionProduit.Produit);

		foreach (var entry in table) //Ici, ce n'est pas possible de faire cela car les jointures ne sont pas supportées
			Debug.Log (entry.RetrieveName ());

		return table;
Je ne sais pas si c'est la solution parce que je sais pas trop quoi en faire. Dès que j'essaie de récupérer quelque chose à l'intérieur, j'ai ce magnifique:
NotSupportedException: Joins are not supported.
Et pourtant la jointure se fait.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6265
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [MY - AL] Sqlite4Unity3d: jointure de tables

Message par boubouk50 » 06 Juin 2016 16:59

Petite avancée: on peut faire des requêtes avec la syntaxe originale:

Code : Tout sélectionner

return  _connection.Query <Produit> ("SELECT * FROM Produit p JOIN Collection_Produit ep ON p.ID=ep.IDProduit JOIN Collection e ON e.ID=ep.IDCollection WHERE e.Nom LIKE ?", collection);
Par contre chose importante:
Il ne faut pas que les noms des champs soit identiques. Dans ce cas précis, mes tables Produit et Collection possédaient toutes les 2 le champs Nom. Il en résultait que le Nom que je récupérais de la table Produit était celui de la table Collection. Allez savoir pourquoi... En différenciant les noms de champs, la requête est devenue correcte.

Un grand merci pour m'avoir servi de canard en plastique. Maintenant, vous savez comment joindre des tables et par la même faire toutes les requêtes possibles, vu qu'on peut utiliser la syntaxe originale. (Ce que j'aurai bien aimé savoir dès le début... :mrgreen: )
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Arkas
Messages : 21
Inscription : 03 Juin 2016 16:51

Re: [RESOLU] Sqlite4Unity3d: jointure de tables

Message par Arkas » 07 Juin 2016 10:45

C'est bien intéressant ça de pouvoir utiliser la syntaxe originale ! Du coup, nous n'aurions pas besoin de passer par un fichier externe ?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6265
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [RESOLU] Sqlite4Unity3d: jointure de tables

Message par boubouk50 » 07 Juin 2016 11:13

Euh... Je ne vois pas le rapport. La syntaxe originale est utile pour les jointures parce qu'elles ne sont pas complètement gérées mais pour des appels simples, je préconiserai quand même d'utiliser la syntaxe propre au plugin.
Quant au fichier externe, tu parles du plugin? Parce que ce n'est pas natif, utiliser la syntaxe originale est propre au plugin, donc il est nécessaire.
Développe un peu la question, je ne la comprends pas.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Arkas
Messages : 21
Inscription : 03 Juin 2016 16:51

Re: [RESOLU] Sqlite4Unity3d: jointure de tables

Message par Arkas » 07 Juin 2016 11:23

Non mais c'est moi qui mélange tout en fait, désolé :)

Je ne sais pas pourquoi je me suis arrêté sur "jointure de tables" et n'ai pas plus que ça fait gaf au fait que tu utilise un plugin. Du coup, ma question n'a aucun sens. Par fichier externe, je parlais d'un fichier en .php contenant les requêtes SQL.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6265
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [RESOLU] Sqlite4Unity3d: jointure de tables

Message par boubouk50 » 07 Juin 2016 11:27

Yep, ici c'est pour une BDD embarquée sans connexion avec le reste.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « (C#) CSharp »