2012-08-17 99 views
0

我有一個lambda expression可以從我的表中獲取多個記錄。該查詢的返回類型應該是什麼?

這裏是表達

public sys_Log_Deposits_Interest_Master GetDepositsPendingRecord(string glCode, int fromDateID) 
     { 
      using (var db = new DataClasses1DataContext()) 
      { 
       var deposit = db.sys_Log_Deposits_Interest_Masters.Where(deposits => deposits.cGLCode.Equals(glCode) && deposits.nFromDateID.Equals(fromDateID)); 
       return deposit; 
      } 
     } 

我得到一個錯誤Cannot implicitly convert type IQueryable To Table Object

我想將表格對象返回到我的Update method,它將更新結果的一些文件。

這裏是我的更新方法

public void UpdatePendingRecords(string glCode, int fromDateID) 
     { 
      using (var db = new DataClasses1DataContext()) 
      { 

       var deposit = GetDepositsPendingRecord(glCode, fromDateID); 

       foreach (var pending in deposit) 
       { 
        pending.cAuthorizedStatus = "Authorized"; 
        pending.dAuthorizedOn = DateTime.Now; 
        pending.cAuthorizedBy = HttpContext.Current.User.Identity.Name; 

       } 
} 
} 

目前我無法得到它的工作。

任何人都可以幫助我解決這個問題嗎?

任何幫助,非常感謝。

+0

使用第一個或FirstOrDefault擴展方法。例如,返回deposit.First(); – 2012-08-17 08:11:25

回答

2

這是一個IQueryable<T>其中T是任何類型sys_Log_Deposits_Interest_Masters是一個表。例如IQueryable<Log_Deposits_Interest_Master>

請注意,sys_Log_Deposits_Interest_Masters是一個實例的表類還實現該接口。結果是一個不同的實現,它有信息知道它應該從那裏得到結果,並在Where中應用過濾器。

您也將上下文置於錯誤的地方,因爲在值被枚舉的時候它不會存在。

在這種情況下,因爲你要直接對結果的工作,而不是應用任何進一步的更改查詢,我的方法倒是foreach通過結果和yield他們,所以它就會變成一個枚舉塊並且生命得到不同的處理。否則,我會通過將數據上下文傳遞給該方法而不是在那裏創建數據上下文來確保數據上下文的存活時間更長,否則我就不會處理它(但只是在一個捏,而linq2sql人說沒有處理datacontexts是安全的,這是違背良好的做法 - 你應該真的假設這樣做是不安全的 - 也只是最安全的時候;你想知道什麼時候是或否?我也沒有。編輯:今天巧合帶來了一個例子,它不安全與https://stackoverflow.com/a/12002914/400547)。

編輯舉例:

最好的方法:

public IQueryable<Log_Deposits_Interest_Master> GetDepositsPendingRecord(DataClasses1DataContext db, string glCode, int fromDateID) 
{ 
    return db.sys_Log_Deposits_Interest_Masters.Where(deposits => deposits.cGLCode.Equals(glCode) && deposits.nFromDateID.Equals(fromDateID)); 
} 

public void UpdatePendingRecords(string glCode, int fromDateID) 
{ 
    using (var db = new DataClasses1DataContext()) 
    { 

    var deposit = GetDepositsPendingRecord(db, glCode, fromDateID); 

    foreach (var pending in deposit) 
    { 
     pending.cAuthorizedStatus = "Authorized"; 
     pending.dAuthorizedOn = DateTime.Now; 
     pending.cAuthorizedBy = HttpContext.Current.User.Identity.Name; 

    } 

    //presumably you want to call db.SubmitChanges() here, no? 
    } 
} 

如果你真的必須包括調用的方法中的datacontext的創作,你可以做

public IEnumerable<Log_Deposits_Interest_Master> GetDepositsPendingRecord(string glCode, int fromDateID) 
{ 
    using(var db = new DataClasses1DataContext()) 
    foreach(Log_Deposits_Interest_Master item in db.sys_Log_Deposits_Interest_Masters.Where(deposits => deposits.cGLCode.Equals(glCode) && deposits.nFromDateID.Equals(fromDateID)) 
     yield return item; 
} 

然而,這」不是個如果你想保存你所做的更改到數據庫非常有用,那麼你必須調用SubmitChanges()在相同的情況下,你從他們或重新綁定他們。這也意味着,如果您要在其上添加另一個Where(),或者使用Count()或其他任何可以傳遞到數據庫的內容,那麼這不會,因爲我們已經打破了該點的可查詢能力。

+0

你能幫我一個例子嗎?謝謝你的回答。 – freebird 2012-08-17 08:19:07

+1

刪除我的答案,因爲這涵蓋了我想說的一切,但更好:) – 2012-08-17 09:00:18

+0

@Jon Hanna感謝您的詳細答案。真的很好解釋。謝謝。 – freebird 2012-08-17 09:04:22

1

從我看到的db。sys_Log_Deposits_Interest_Masters表示sys_Log_Deposits_Interest_Master對象的集合。您的Where查詢還會返回無法轉換爲單個對象的對象集合(IQueriable)。如果您確定您的Where查詢返回了一個且只有一個條目,那麼可以用Single或SingleOrDefault語句替換它,並使用相同的條件。如果它可以返回多個對象,但只需要第一個對象,則可以使用First或FirstOrDefault,並使用相同的條件。

+0

@EIDog我的表格將返回多個記錄。感謝您的幫助。 – freebird 2012-08-17 08:21:09

0

添加.ToList()擴展,則是這樣的:

var deposit = db.sys_Log_Deposits_Interest_Masters.Where(deposits => deposits.cGLCode.Equals(glCode) && deposits.nFromDateID.Equals(fromDateID)).ToList(); 
+0

如果每次只使用一個,爲什麼要將每個結果加載到內存中? – 2012-08-17 08:17:41

+0

調用foreach循環會將它全部加載到內存中,它只是在早些時候執行兩次執行。 – hofnarwillie 2012-08-17 08:19:04

+0

調用foreach循環將一次加載到內存中,在將它作爲一個單元傳遞之前,您將首先加載每個循環 - 這會導致大量的結果集,這可能是浪費的內存和浪費的時間。即使有一個小的結果集,當你沒有特定的理由(在下一個操作之前需要知道大小,在相同的數據上做幾次傳遞),使用'ToList()'是過早的悲觀。此外,如果他們想要將更改保存回數據庫,則無論如何都需要保持上下文。 – 2012-08-17 08:52:57

相關問題