0
votes

Comment créer correctement un syndicat à partir de deux tables Sélectionner uniquement des colonnes spécifiques où une colonne va vider avec du texte

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 ttask et un autre est ttask_users .

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.

Voici mon code SQL: xxx

Voici ce que j'ai essayé xxx

Voici les erreurs que je reçois: xxx


8 commentaires

Pas sûr que Union est la voie à suivre pour une seule colonne. Considérez quelque chose comme propriétaire = gaspical? articles.tofficeuser.login: "Aucun propriétaire", ...


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 renvoie un résultat - vous ne faites rien avec le résultat de l'appelant Union dans votre exemple de code. C'est comme si vous avez A + B; comme instruction - A et b 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 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 avec QueryTask . Query2 est la sous-requête partielle qui obtient ttask_user avec vettype == 5 mais ne pas projeter à un maingriddo . La deuxième fois que vous avez un syndicat Query avec TaskQuery . TaskQuery est la sous-requête partielle qui obtient ttasks avec HABLEOser == 0 mais ne projet pas à MAINGRIDDTO . Pourquoi n'avez-vous pas fait var ans = requête.union (QueryTask); ?


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.


3 Réponses :


1
votes

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
            };


3 commentaires

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



0
votes

Je pourrais avoir tort, mais cela ressemble à un problème avec des types. La règle générale est:

  1. Les deux types doivent avoir exactement la même propriété noms
  2. Les deux types doivent avoir exactement la même propriété types ( int vs a smallint ou double vs a décimal provoquera une erreur de construction)

    ressemble à Query2 est le type de iquéryable et QueryTask est le type de iQueryable C'est pourquoi vous ne pouvez pas faire un syndicat ici: xxx


2 commentaires

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



0
votes

Suivre mon SQL à Linq Recette , vous effectuez d'abord les deux sous-requêtes de SQL:

var ans = query1.Union(query2);


4 commentaires

J'ai reçu cette erreur " Le type de données de texte ne peut pas être sélectionné comme distinct car il n'est pas comparable. "


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 garantit des réponses distinctes - si vous n'avez pas besoin de cette garantie, vous pouvez utiliser concat à la place, quelle est la traduction appropriée d'un SQL Union .