web-dev-qa-db-de.com

Kann ich mit linq eine Tabelle mit einer Liste verbinden?

Ich habe einen Tisch wie folgt:

PersonalDetails

Columns are:

Name  
BankName
BranchName
AccountNo
Address

Ich habe eine andere Liste, die 'Name' und 'AccountNo' enthält . Ich muss alle Datensätze aus der Tabelle finden, deren 'Name' und 'AccountNo' in der angegebenen Liste vorhanden sind. 

Jeder Vorschlag wird hilfreich sein.

Ich habe folgendes getan, aber nicht viel genutzt:

var duplicationhecklist = dataAccessdup.MST_FarmerProfile
                          .Join(lstFarmerProfiles, 
                                t => new { t.Name,t.AccountNo}, 
                                t1 => new { t1.Name, t1.AccountNo}, 
                                (t, t1) => new { t, t1 })
                           .Select(x => new {
                                               x.t1.Name,
                                               x.t1.BankName,
                                               x.t1.BranchName,
                                               x.t1.AccountNo
                                             }).ToList();

dabei ist lstFarmerProfiles eine Liste.

12
Saket

Sie haben wahrscheinlich herausgefunden, dass Sie eine Entity Framework LINQ-Abfrage nicht mit einer lokalen Liste von Entitätsobjekten verknüpfen können, da sie nicht in SQL übersetzt werden kann. Ich würde die Datenbankdaten nur auf die Kontonummern vorwählen und dann in den Speicher einbinden.

var accountNumbers = lstFarmerProfiles.Select(x => x.AccountNo).ToArray();

var duplicationChecklist = 
        from profile in dataAccessdup.MST_FarmerProfile
                                     .Where(p => accountNumbers
                                                    .Contains(p.AccountNo))
                                     .AsEnumerable() // Continue in memory
        join param in lstFarmerProfiles on 
            new { profile.Name, profile.AccountNo} equals 
            new { param.Name, param.AccountNo}
        select profile

Sie werden also niemals die Massendaten in den Speicher ziehen, aber die kleinste Auswahl, die Sie wahrscheinlich ausführen können, ist möglich.

Wenn accountNumbers Tausende von Elementen enthält, können Sie eine besser skalierbare chunky Contains-Methode in Betracht ziehen.

18
Gert Arnold

Wenn MST_FarmerProfile nicht super groß ist, denke ich, ist es die beste Option, es mit AsEnumerable() in den Speicher zu bringen und dort zu verbinden.

var duplicationhecklist = 
             (from x in dataAccessdup.MST_FarmerProfile
                        .Select(z => new {
                                            z.Name, 
                                            z.BankName, 
                                            z.BranchName,
                                            z.AccountNo
                                          }).AsEnumerable()
              join y in lstFarmerProfiles
                 on new { x.Name, x.AccountNo} equals new { y.Name, y.AccountNo}
              select x).ToList();
2
Magnus

Versuchen Sie, die Contains -Methode zu verwenden, da Sie die Listen in .net mit den zu suchenden Werten haben.

List<string> names = /* list of names */;
List<string> accounts = /* list of account */;

var result = db.PersonalDetails.Where(x => names.Contains(x.Name) && accounts.Contains(x.AccountNo))
                               .ToList();
2
Felipe Oriani

Wenn accountNo den Datensatz identifiziert, können Sie Folgendes verwenden:

var duplicationCheck = from farmerProfile in dataAccessdup.MST_FarmerProfile
                       join farmerFromList in lstFarmerProfiles
                       on farmerProfile.AccountNo equals farmerFromList.AccountNo
                       select new { 
                                      farmerProfile.Name, 
                                      farmerProfile.BankName, 
                                      farmerProfile.BranchName, 
                                      farmerProfile.AccountNo 
                                  };

Wenn Sie sich bei Name und Konto anmelden müssen, sollte dies funktionieren:

 var duplicationCheck = from farmerProfile in dataAccessdup.MST_FarmerProfile
                        join farmerFromList in lstFarmerProfiles
                        on new
                        {
                            accountNo = farmerProfile.AccountNo,
                            name = farmerProfile.Name
                        }
                        equals new
                        {
                            accountNo = farmerFromList.AccountNo,
                            name = farmerFromList.Name
                        }
                        select new
                        {
                            farmerProfile.Name,
                            farmerProfile.BankName,
                            farmerProfile.BranchName,
                            farmerProfile.AccountNo
                        };

Wenn Sie duplicateChecklist nur einmal durchlaufen, ist es für die Leistung besser,.

0
Bvrce

Da sich Daten normalerweise auf verschiedenen Maschinen oder in separaten Prozessen befinden: DB - ist eine und Ihre In-Memory-Liste ist Ihre App. Es gibt nur zwei Möglichkeiten, dies zu tun. 

  1. Laden Sie einen möglichst kleinen Datenteil aus der Datenbank in die lokale Datenbank herunter und verbinden Sie ihn lokal (normalerweise mit AsEnumerable() oder grundsätzlich ToList()). In anderen Antworten haben Sie viele gute Gedanken dazu.
  2. Eine andere ist anders - laden Sie Ihre lokalen Daten irgendwie auf den Server hoch und führen Sie eine Abfrage auf der DB-Seite durch. Das Hochladen kann auf unterschiedliche Weise erfolgen: Verwenden einiger temporärer Tabellen OR mit VALUES. Glücklicherweise gibt es jetzt eine kleine Erweiterung für EF (sowohl für EF6 als auch für EF Core), die Sie ausprobieren könnten. Es ist EntityFrameworkCore.MemoryJoin (Name kann verwirrend sein, unterstützt jedoch sowohl EF6 als auch EF Core). Wie in article des Autors angegeben, ändert es die an den Server übergebene SQL-Abfrage und fügt die Konstruktion von VALUES ​​ mit Daten aus Ihrer lokalen Liste ein. Die Abfrage wird auf dem DB-Server ausgeführt.
0
Tony