J'ai deux tables de transaction nommées comme maintenant je veux obtenir tous ces transactionnements de parenttransaction dont J'ai une table comme celle-ci: p> enfanttransaction p> ceci est ma requête: p> mais ici i Obtenez une transaction ID 1 et 2 Bien que leur transaction soit terminée en deux parties de 600 et 400 pour la transaction ID 1. P> P> transactionnement code> de parenttransaction strong> agira comme étrangère à enfanttransaction forte> de transacactionneur code>. payAmount code> n'est pas terminé. p> < P> de la sortie ci-dessous, je veux un enregistrement de transaction ID 3 car seulement 1000 a été payé pour transactionneur code> 3 au lieu de 5000. p>
5 Réponses :
Je ne suis pas sûr que ! = code> est une meilleure valeur. Voici une solution avec > code> Vérification et regroupement: var expectedValue =
context.ParentTransaction
.GroupJoin(context.ChildTransaction, parent => parent.TransactionId, child => child.TransactionId, (parent, gj) => new { parent, gj })
.SelectMany(@t => @t.gj.DefaultIfEmpty(), (@t, subset) => new { @t, subset })
.Select(@t => new { @t, joined = new { Transaction = @t.@t.parent, Deposit = @t.subset != null ? @t.subset.Deposit : 0 } })
.GroupBy(@t => @t.joined.Transaction, @t => @t.joined)
.Select(grouped => new { grouped, g = new { Transaction = grouped.Key, Deposit = grouped.Sum(e => e.Deposit) } })
.Where(@t => @t.g.Transaction.PayAmount > @t.g.Deposit)
.Select(@t => @t.g.Transaction);
pouvez-vous s'il vous plaît expliquer moi votre requête.Veuillez
Merci beaucoup monsieur pour une question géniale. J'ai vraiment eu beaucoup de mal à faire cela.Cant même merci car merci vous seriez si petit de vous remercier.
Lorsque j'ajoute 1 transaction dans la transaction parente dont l'entrée n'est pas là dans la transaction enfant, de sorte que la transaction soit impayée correctement .Pour Par exemple: Transaction ID: 4 Donc, cette transaction avec ID: 4 ne vient pas avec votre requête mise à jour.
@ Earning Oui Il y avait un problème. J'ai mis à jour ma réponse avec un exemple de joindre à gauche un lien supplémentaire vers MSDN.
Attendez-moi de tester votre requête, mais merci de mettre à jour votre réponse
Votre requête ci-dessus consiste à obtenir toutes les transactions non rémunérées.can J'utilise la même requête pour obtenir toutes les transactions payées. Je veux dire ces transactions dont le paiement complet a été effectué. Pour par exemple: transaction 1 et 2
@ Earning Bien sûr, changez simplement où expression dans votre requête à @T => @ tgtransaction.payamount == @tgdeposit code> ou @ tgtransaction.payamount <= @tgdeposit Code>
Désolé, votre requête pour obtenir toutes les transactions payantes ne fonctionne pas. Je suppose que cela ne fonctionnera pas avec toutes les transactions non rémunérées. J'ai essayé celui-ci: AR attendueValue = de parent in context.parenttransaction
Belle solution orientée. OMI, lors de la création de requêtes SQL, vous obtenez de meilleurs résultats lorsque vous pensez en termes de filtrage / combinaison d'ensembles d'enregistrements, plutôt que de considérer toutes les conditions d'un seul enregistrement (si vous voyez ce que je veux dire). Et je pense que c'est plutôt optimiste de certaines personnes de penser que les optimiseurs de la requête trouveront eux-mêmes des transformations de requêtes orientées dossées dans des requêtes orientées vers lesquelles (c'est-à-dire, de changer les requêtes imbriquées à des jointures). (Mais sur ce dernier point, je suis prêt à être corrigé par quiconque bien informé.)
List<int> obj = new List<int>();
using (DemoEntities context = new DemoEntities())
{
obj = (from ct in context.CTransactions
group ct by ct.Transactionid into grp
join pt in context.PTransactions on grp.Key equals pt.Transactionid
where grp.Sum(x => x.DepositAmount) < pt.PayAmount
select grp.Key).ToList();
}
Merci beaucoup pour vos bons efforts visant à m'aider.
Vous ne contrôlez qu'une seule transaction enfant. Vous devez utiliser somme () code> opération et besoin d'utiliser > code> au lieu de ! = Code> pls essayer ceci.
Merci beaucoup pour vos bons efforts visant à m'aider.
Pas de problème camarade. J'espère que cette réponse vous a aidé.
L'idée générale des langues de requête est d'exprimer le résultat souhaité l'appliquer à votre scénario conduit à une simple requête comme celle-ci p> si vous utilisez EF forte> et une propriété de navigation de modèle appropriée, il serait même simple p> On peut dire que ce qui précède serait inefficace par rapport à la réponse de @vadim Martynov Répondre. Eh bien, peut être oui, peut ne pas être. Vadim tente de forcer un plan d'exécution joindre code> vs sous-requête code> etc. p> p>
pouvez-vous me montrer une requête équivalente SQL pour cela s'il vous plaît
@Learning Ajouter var sql = Query.tostring (); code>, exécutez VS débogueur, mettez un point d'arrêt et examinez SQL code> variable dans les locaux / fenêtre de surveillance avec le texte Visualizer.
avez-vous regardé Vadim Query.can tu me dites quelque chose à ce sujet parce que je n'ai pas compris quoi que ce soit dans sa requête
Oui je l'ai fait. C'est une façon correcte et alternative de produire le même résultat. Mais c'est le point principal de mon post, en regardant la requête, il est difficile de comprendre ce qu'il fait. Vous pouvez utiliser la documentation IntelliSense et MSDN pour le comprendre, mais il crée fondamentalement une substitution qui regroupe les transactions enfants par trasactionid code> et calcule la somme du debitamout code>, puis joint cette sous-requête à < Code> Parenttransaction Code> Table pour obtenir le résultat final.
oui sa requête est correcte mais vraiment difficile de comprendre ce qu'il fait est sa requête
Dans votre requête Comment puis-je sélectionner des fieilds de ma table parenttransaction?
La façon dont j'ai écrit, il renvoie tous les champs de la table parenttransaction code>, c'est pourquoi aucune sélection spéciale n'est nécessaire.
Je parle de votre première requête
Laissez-nous Continuez cette discussion en chat .
Le problème réside sur cet énoncé: p> et puisque le Visualizer strong>: p> mais ce que vous voulez avoir plutôt: p> Visualizer strud>: p> Ainsi, vous devez faire Changez votre code comme celui-ci: p> explications forte> p> Cette ligne: p> TMP1 code> est défini comme un single Strong> Transaction des enfants, la déclaration entraînerait d'assimiler des valeurs incorrectes: p> TMP1 code> est comme une collection
solution h2>
transaction non rémunérée h3>
var grp = context.ChildTransaction.GroupBy(y => y.TransactionId);
var data = (from tmp in context.ParentTransaction
join tmp1 in grp //group this by transaction id
on tmp.TransactionId equals tmp1.Key //use the key
where tmp.PayAmount > tmp1.Sum(x => x.DepositAmount)
select tmp)
.Union((
from tmp in context.ParentTransaction
where !context.ChildTransaction.Select(x => x.TransactionId).Contains(tmp.TransactionId)
select tmp));
var datapaid = (from tmp in context.ParentTransaction
join tmp1 in grp
on tmp.TransactionId equals tmp1.Key
where tmp.PayAmount <= tmp1.Sum(x => x.DepositAmount)
select tmp);
Pouvez-vous me dire quelle est la différence entre la requête de votre requête et D mayuri comme parce que j'ai déjà essayé d de la requête Mayuri qui ne fonctionne pas
@ Earning je n'ai pas essayé D. Mayuri. Mais j'ai essayé ma propre requête et ça marche bien. Donnez-moi un moment, je l'essayerais. Et pendant ce temps, vous pourriez aussi essayer le mien ...
Ouais, je vais certainement essayer votre requête, mais s'il vous plaît considérer les cas que j'ai décrits sur Vadim Answers.Voir mes commentaires sur Vadim Répondre
@ Earning Aah, je vois. Vous voulez aussi obtenir la transaction 4 qui n'a pas de paye du tout ... je vais mettre à jour ma réponse ..
Je veux juste obtenir toute transaction non rémunérée.
Laissez-nous Continuez cette discussion en chat .