J'essaie de traduire le code SQL que j'ai écrit avec une union dans le code Linq en C #, mais je ne comprends pas ce que je fais mal.
J'ai deux tables que l'on est J'ai essayé de les joiner ensemble en utilisant un modèle, car je pensais que c'était me donnant des erreurs car les données n'avaient pas le même nombre de Colonnes. P> Voici mon code SQL: p> Voici ce que j'ai essayé p> Voici les erreurs que je reçois: p> ttask code > et un autre est
ttask_users code>. p>
3 Réponses :
Une seule question est suffisante. Notez le changement d'où et dans la propriété propriétaire.
var query2 = db.tTask_User.Where(task => task.hasOwner == 0 || (task.Enabled && task.tTaskRecipientType.pk_taskrecipienttype == 5)); var query = from items in query2 select new MainGridDto() { PK_Task = items.FK_Task, TaskName = items.tTask.TaskName, TaskRecipientType = items.tTaskRecipientType, Owner = items.hasOwner == 0 ? "no owner" : items.tOfficeUser.Login, TaskDescription = items.tTask.TaskDescription, Enabled = items.tTask.Enabled, tTaskTeam = items.tTask.tTaskTeam, EmailBody = items.tTask.EmailBody, EmailSubject = items.tTask.EmailSubject };
Oui, cela me rapproche de ce dont j'ai besoin. La seule chose à faire pour me procurer les mêmes résultats que la requête SQL que j'ai écrite ci-dessus est si la tâche n'a pas de propriétaire indiquant qu'une seule tâche. Certaines tâches ont d'autres types comme BCC, TO, ERROR, ECT ... et pour chaque type de la tâche, cela me donnera tous ces objets sur ma grille. Comme si une tâche a 5 types et cette tâche n'a pas de propriétaire, cela me donnera 5 tâche montrant "aucun propriétaire". Comment puis-je ne pas me montrer qu'une seule tâche s'il n'a pas de propriétaire au lieu de me dire 5 fois qu'il n'a pas de propriétaire. Je pense que l'union
se débarrassait de ces doubles duplicats et ne me donnant que la tâche me disant qu'il n'y a pas de propriétaire. Si cela fait ressort ... Je sais qu'il est difficile de savoir quand vous ne pouvez pas voir la structure ou les données.
J'apprécie vraiment ça. Cela m'a beaucoup beaucoup plus loin que j'avais auparavant. J'avais présenté plus de 2000 enregistrements et maintenant, c'est jusqu'à 635. Cela devrait améliorer les choses
Je pourrais avoir tort, mais cela ressemble à un problème avec des types. La règle générale est:
int code> vs a
smallint code> ou double code> vs a décimal code> provoquera une erreur de construction) li>
ol> ressemble à Query2 code> est le type de iquéryable code> et QueryTask code> est le type de iQueryable code> C'est pourquoi vous ne pouvez pas faire un syndicat ici: p> xxx pré> p>
C'est pourquoi j'ai essayé de sélectionner de nouveaux Maingriddo sur les deux afin d'avoir les mêmes types de données de modèle. Je ne comprends toujours pas comment pouvoir les rejoindre ensemble. Dans mon code SQL, j'ai mis, je reçois les résultats exacts dont j'ai besoin, mais en traduisant cela à Linq, je trouve un peu délicat.
@ElQuesogrand peut-être que vous pouvez essayer de sélectionner maingriddo à partir de Query2 ... faites-leur le même type, ou même type anonyme, il devrait trop fonctionner
Suivre mon SQL à Linq Recette , vous effectuez d'abord les deux sous-requêtes de SQL:
var ans = query1.Union(query2);
J'ai reçu cette erreur "
Vous savez-vous de savoir ce que cela causant cela? J'ai essayé de vérifier si le propriétaire = "Aucun propriétaire" lui faisait causer cela et je l'ai pris sur les deux requêtes et je vais toujours faire une erreur.
Je pensais que celui-ci ... semble que la base de données a eu des problèmes avec le texte de type de données et je l'ai changé à Varchar. Ça fonctionne!! Merci
Remarque: dans linq, Union code> garantit des réponses distinctes - si vous n'avez pas besoin de cette garantie, vous pouvez utiliser
concat code> à la place, quelle est la traduction appropriée d'un SQL
Union code>.
Pas sûr que
Union code> est la voie à suivre pour une seule colonne. Considérez quelque chose comme
propriétaire = gaspical? articles.tofficeuser.login: "Aucun propriétaire", ... code>
JUSDT Utilisez une jointure au lieu d'un syndicat: code.msdn.microsoft.com/101 -Luq-échantillons-3fb9811b
Eh bien, j'ai besoin des résultats de ces deux requêtes différentes, car cela me procure une tâche qui possède des propriétaires et une tâche qui n'ont pas de propriétaires du tout seront vides. Mais je ne peux pas sembler combiner les deux choses ensemble parce que cela me donne des erreurs
@JDWENG - Qui tu veux dire Join Joindre - Joindre n'est pas un opérateur défini qui fait quelque chose de totalement différent.
Union code> renvoie un résultat - vous ne faites rien avec le résultat de l'appelant
Union code> dans votre exemple de code. C'est comme si vous avez
A + B; code> comme instruction -
A code> et
b code> ne sont pas affectés. Aussi ni l'autre Union n'a de sens - dans les deux que vous combinez une sous-requête partielle avec une sous-requête finie. Peut-être mon Recette SQL à Linq A> pourrait vous aider.
@Netmage, j'ai du mal à comprendre comment fonctionne Linq. Je n'essaie pas de faire quoi que ce soit avec les résultats, je veux juste retourner les résultats après avoir combiné les deux requêtes ensemble pour peupler ma grille. Je ne comprends pas pourquoi c'est une sous-requête partielle? Pouvez-vous expliquer cela s'il vous plaît?
Donc, la première fois que vous syndicatez
Query2 code> avec
QueryTask code>.
Query2 CODE> est la sous-requête partielle qui obtient
ttask_user code> avec vettype == 5 mais ne pas projeter à un
maingriddo code>. La deuxième fois que vous avez un syndicat
Query code> avec
TaskQuery code>.
TaskQuery Code> est la sous-requête partielle qui obtient
ttasks code> avec
HABLEOser == 0 code> mais ne projet pas à
MAINGRIDDTO code> . Pourquoi n'avez-vous pas fait
var ans = requête.union (QueryTask); code>?
oh wow ... tu as raison. Je n'ai même pas vu que @Why ne fais pas Var Ans = Query.union (QueryTask) J'utilisais la mauvaise requête C'est pourquoi ça ne marche pas ... de toute façon, cela a du sens et je comprends pourquoi tu veux dire que tu veux dire sur la sous-requête partielle et la projection.