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.
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.
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();
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();
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,.
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.
AsEnumerable()
oder grundsätzlich ToList()
). In anderen Antworten haben Sie viele gute Gedanken dazu.