2013-12-10 84 views
9

我有一個表,如下所示:我可以使用linq將表加入列表嗎?

PersonalDetails 

Columns are: 

Name 
BankName 
BranchName 
AccountNo 
Address 

我有一個包含「名稱」和「AccountNo」另一個列表。 我必須從表中找到所有記錄,其中的'姓名'和'帳戶號碼'在給定列表中。

任何建議都會有幫助。

我做以下,但沒多大用處:

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(); 

其中lstFarmerProfiles是一個列表。

+0

您如何向我們展示您首先嚐試了什麼? – gleng

+0

@gleng:好的。編輯。 – Saket

+0

@gleng:現在你能幫忙嗎? – Saket

回答

16

您可能已經發現您無法使用本地實體對象列表來加入實體框架LINQ查詢,因爲它無法轉換爲SQL。我只會在賬號上預選數據庫數據,然後加入內存。

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 

因此,您將永遠不會將批量數據拖入內存,但是您可能會繼續處理最小的選擇。

如果accountNumbers包含數千個項目,您可以考慮使用更好的可擴展chunky Contains method

+0

我收到以下異常:「未將對象引用設置爲對象的實例。」 – Saket

+0

它在執行第二個查詢之後發生。來源是'FarmerProfiling',lstFarmerProfiles是這個模型的列表。 – Saket

+0

它很少修改。謝謝! – Saket

0

既然你有你想找到值的.NET的名單,嘗試使用Contains方法,樣品:

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(); 
+0

有一個名單和帳戶的列表。 – Saket

+0

難道你不能將它分成兩個列表來使用像我顯示的?! –

+0

它不會匹配數據庫的每條記錄到列表的每一行。 – Saket

2

如果MST_FarmerProfile是不是超級大我覺得你最好的選擇是把它使用AsEnumerable()進入內存並進行加入。

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(); 
+0

MST_FarmerProfile包含200萬條記錄。你還會建議嗎? – Saket

+0

@sake也許你不需要將表中的所有列都帶入內存,在'.AsEnumerable()'之前做一個選擇來獲得你需要的列。知道執行時間是否可以接受的唯一方法就是測試它。 – Magnus

+0

@Saket'lstFarmerProfiles'會有多大? – Magnus

0

如果accountNo標識記錄,那麼你可以使用:

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

如果你需要加入的姓名和賬號,然後這應該工作:

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

如果你只打算去一次duplicateChecklist然後離開.ToList()出來會更好的性能。

相關問題