0
votes

C #: Groupe LINQ Plusieurs types de données avec différence dans RowCount

Je suis assez nouveau à l'aide de Datables Linq + et je suis coincé depuis un certain temps. J'ai cherché Internet pour des problèmes et une solution similaires, mais ce n'est pas exactement ce que je veux accomplir.

Je vais faire de mon mieux pour décrire le cas et la configuration:

dans le texte :

J'ai 3 datables remplis d'une requête SQL.

  1. Acdtable (6 lignes)
  2. Honeable (5 rangées)
  3. transfert (4 lignes)

    acdtable contient les colonnes suivantes:
    Nombre de saison, date (DD-MM-AAAAAA), Nombre de dayes, Scores

    Honeable contient les colonnes suivantes:

    Nombre de saison, Date (DD-MM-AAAAAAA), DayNumber, Heures

    Transférabilité contient les colonnes suivantes:

    Nombre de saison, date (DD-MM-AAAAAA), Nombre de daynumé, transféré

    Le problème est lorsque j'utilise LINQ pour rejoindre les fichiers-types avec chaque (sur la semaine), je n'aurai que 4 rangées au lieu du 6 i besoin.

    Si j'ai raison, cela a quelque chose à voir avec les valeurs jointes qui n'existent pas dans la Table Fe:
    ACDTABLE est doté de la semaine 20 avec date 21-7-2020 et heure d'heure du week -gle 20 sans 21-7-2020 identique à un transfert

    Dans ce cas, je voudrais voir: < BR> Si une ligne d'une acdtable n'existe pas dans une acdtable ou une heure d'heure:
    Nombre de semaine 20, Date 21-7-2020, Scores 10, Heures 0, Transferts 0

    Si une ligne d'une acdtable existez dans une acdtable et ou une queue:
    Nombre de semaine 20, Date 21-7-2020, Scores 10, Heures 32, Transferts 12

    J'espère que l'exemple est clair pour ce que je veux accomplir.

    mon code : xxx

    mon résultat: xxx

    résultat i vouloir accomplir: xxx

    Qu'est-ce que je fais mal ou que puis-je faire pour obtenir le résultat que je veux?

    J'espère que quiconque peut m'aider.


2 commentaires

Regardez cette question et répondez à propos de DISTINCT Vous devriez pouvoir obtenir une seule valeur pour chaque résultat.


Vous avez écrit: si une ligne d'acdtable n'existe pas dans ACDTable ou Hour Tabled ... N'as-tu voulu dire: Si une ligne d'acdtable n'existe pas dans la transmission ou l'heure de ... . Est le système d'exploitation, veuillez éditer la question pour le corriger.


3 Réponses :


0
votes

essayer suivi:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication11
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable cdTable = new DataTable(); //(6 rows)
            cdTable.Columns.Add("Weeknumber", typeof(int));
            cdTable.Columns.Add("Date", typeof(DateTime));
            cdTable.Columns.Add("Daynumber", typeof(int));
            cdTable.Columns.Add("Scores", typeof(int));

            cdTable.Rows.Add(new object[] { 29, new DateTime(2020, 7, 13), 0, 201 });
            cdTable.Rows.Add(new object[] { 29, new DateTime(2020, 7, 14), 0, 156 });
            cdTable.Rows.Add(new object[] { 29, new DateTime(2020, 7, 15), 0, 155 });
            cdTable.Rows.Add(new object[] { 29, new DateTime(2020, 7, 16), 0, 122 });
            cdTable.Rows.Add(new object[] { 29, new DateTime(2020, 7, 17), 0, 0 });

            DataTable hourTable = new DataTable();//(5 rows)
            hourTable.Columns.Add("Weeknumber", typeof(int));
            hourTable.Columns.Add("Date", typeof(DateTime));
            hourTable.Columns.Add("Daynumber", typeof(int));
            hourTable.Columns.Add("Hours", typeof(int));

            hourTable.Rows.Add(new object[] { 29, new DateTime(2020, 7, 13), 0, 44 });
            hourTable.Rows.Add(new object[] { 29, new DateTime(2020, 7, 14), 0, 38 });
            hourTable.Rows.Add(new object[] { 29, new DateTime(2020, 7, 14), 0, 25 });
            hourTable.Rows.Add(new object[] { 29, new DateTime(2020, 7, 15), 0, 37 });
            hourTable.Rows.Add(new object[] { 29, new DateTime(2020, 7, 15), 0, 50 });
            hourTable.Rows.Add(new object[] { 29, new DateTime(2020, 7, 16), 0, 26 });
            hourTable.Rows.Add(new object[] { 29, new DateTime(2020, 7, 17), 0, 0 });

            DataTable transferTable = new DataTable();//(4 rows)
            transferTable.Columns.Add("Weeknumber", typeof(int));
            transferTable.Columns.Add("Date", typeof(DateTime));
            transferTable.Columns.Add("Daynumber", typeof(int));
            transferTable.Columns.Add("Transfered", typeof(string));

            transferTable.Rows.Add(new object[] { 29, new DateTime(2020, 7, 13), 0, "2" });
            transferTable.Rows.Add(new object[] { 29, new DateTime(2020, 7, 14), 0, "3" });
            transferTable.Rows.Add(new object[] { 29, new DateTime(2020, 7, 15), 0, "1" });
            transferTable.Rows.Add(new object[] { 29, new DateTime(2020, 7, 16), 0, "2" });

            var results = (from cd in cdTable.AsEnumerable()
                           join hour in hourTable.AsEnumerable() on cd.Field<DateTime>("Date") equals hour.Field<DateTime>("Date")
                           join t in transferTable.AsEnumerable() on cd.Field<DateTime>("Date") equals t.Field<DateTime>("Date")
                           select new { cd = cd, hour = hour, transfer = t }
                           ).GroupBy(x => x.cd.Field<DateTime>("Date"))
                           .Select(x => new {
                               Weeknumber = x.First().cd.Field<int>("Weeknumber"),
                               Date = x.First().cd.Field<DateTime>("Date"),
                               Transfers = x.First().transfer.Field<string>("Transfered"),
                               Sales = x.First().cd.Field<int>("Scores"),
                               Hours = string.Join(",",x.Select(y => y.hour.Field<int>("Hours")))
                           }).ToList();

        }
    }
 

}


2 commentaires

Merci de votre réponse, cela semblait venir le plus proche que je le veux. Même si dans cet exemple, je manque ceux sans vente, transferts ou heures. Par exemple: Dans ce cas, une acdtable a la date: 17-07-2020 mais il n'y a pas d'enregistrement dans l'heure de l'heure et de la transférabilité de cette date. Alors est-il possible d'obtenir: {week -né = 29, date = "17-07-2020", transferts = "0", vente = 0, heures = "0"} aussi?


Quelle (s) table (s) a toutes les dates? Lorsque vous faites une jointure et que toutes les entrées n'ont pas toutes les valeurs que vous devez utiliser une jointure extérieure gauche. Voir: docs.microsoft.com/fr- US / DotNet / Csharp / Linq / ...



0
votes

Vous voulez donc rejoindre trois tables sur un keyvalue égal. Si, pour chaque ligne de l'acdtable, vous voulez que toutes les lignes de transfert et d'une heure avec le même nombre et la même date.

ALAS LINQ n'a pas de méthode pour rejoindre trois tables, nous devrons donc la créer. Si nous faisons cela comme une méthode d'extension, nous pouvons l'utiliser comme s'il s'agissait d'une méthode LINQ standard. Voir Méthodes d'extension Démystifié p>

convertir la table en iEnumerable h2>

Vous ferez des choses de type Linq plus souvent. Considérez de créer des méthodes d'extension qui convertissent vos tables en iEnumérables: p> xxx pré>

pour convertir la table en ACD est une doublure: P>

var result = Schools.GroupJoin(Students, Teachers:

// KeySelectors:
school => school.Id,           // from every School take the primary key in Id
student => student.SchoolId,   // from every Student take the foreign key to School
teacher => teacher.SchoolId,   // from every Teacher take the foreign key to School

// ResultSelector: for every School, with all its Students and all its Teachers:
(school, students, teachers) => new
{
    Id = school.Id,
    Name = school.Name,
    ...

    Students = students.Select(student => new
    {
         Id = student.Id,
         Name = student.Name,
         ...
    })
    .ToList(),

    Teachers = teachers.Select(teacher => new
    {
       ...
    })
    .ToList(),
);


0 commentaires

0
votes

Je ne suis vraiment pas si bon à Linq. Mais si je peux développer la réponse de Jdweng. Serait le souffle ci-dessous?

J'ai ajouté une jointure gauche avec un chèque null (uniquement sur les transferts) xxx


0 commentaires