2016-06-29 157 views
1

我是LINQ查詢表達式的新手,它使用lambda表達式。我有一種方法可以用來更新不同表格中的值。 它工作正常單身或默認,但不是當我使用Where條件。LINQ lambda表達式中的條件

public static void UpdateData(int UserID) 
{ 
    using (var objEntity = new DataContext()) 
    { 

     UserMaster objUser = objEntity.UserMasters.SingleOrDefault(TBL => TBL.UserID == UserID); 
     UserOfferUsed objUserUsed = objEntity.UserOfferUseds.Where(TBL => TBL.UserID == UserID); 
     objUser.Purchaseon = DateTime.Now.ToString("dd MMMM yyyy"); 
     objUserUsed.UsedCoupon = 0; 
     objEntity.SaveChanges(); 
     objData = null; 
    } 
} 

錯誤:無法隱式轉換類型 'System.Linq.IQueryable' 到 'Database.UserOfferUsed'。一個顯式轉換存在(你 缺少強制轉換?)

回答

4

.Where將返回IQueryable這裏,使用.SingleOrDefault.FirstOrDefault得到的結果(如果需要的結果是隻有一個項目)。或者如果結果將包含多個元素,則可以使用.ToList()。如果是這樣,你必須改變objUserUsedList<UserOfferUsed>也就是說,您的代碼將是這樣的:

UserOfferUsed objUserUsed = objEntity.UserOfferUseds.FirstOrDefault(TBL => TBL.UserID == UserID); 

或者這樣

List<UserOfferUsed> objUserUsed = objEntity.UserOfferUseds.Where(TBL => TBL.UserID == UserID).ToList(); 

您可以根據自己的需要選擇上述之一;

更新:如果UserID是列表中的每個元素的巧妙然後.FirstOrDefault()會因爲查詢不會給不止一個結果(你必須要考慮null過,由於FirstOrDefault()會給空,如果是最好的選擇沒有找到指定的匹配)。如果用列表,並要更新這些值意味着你可以做如下所示:

foreach(var objUserUsed in objEntity.UserOfferUseds.Where(TBL => TBL.UserID == UserID)) 
{ 
    objUserUsed.UsedCoupon = 0; 
} 
+0

謝謝你的快速反應。但我得到列表後,我如何更新objUserUsed表的列值?因爲我需要更新表中的一個以上的值..不僅單個或第一個.. –

+0

@KuldipRana:我已經更新了答案 –

+1

而不是這個'objUserUsed = objEntity.UserOfferUseds.Where(TBL => TBL.UserID ==用戶ID).FirstOrDefault()';我們可以試試這個'objUserUsed = objEntity.UserOfferUseds.FirstOrDefault(TBL => TBL.UserID == UserID);' – Eldho

1

一個LINQ聲明作用於那些枚舉序列。這意味着你可以說:給我第一個。和:我有這個,給我下一個。

大多數linq運算符返回一個IEnumerable < T>,意思是它返回另一個序列。直到你執行像foreach之類的東西,或者直到你執行了一條不返回的linq語句,序列才被枚舉。IEnumerable < T>但是T

換句話說:只要你的語句返回序列,代碼不是真正列舉。

如果查找SingleOrDefault,您會看到返回值是T.要計算返回值,將枚舉序列。

Enumerable.Where的返回值不是T,但IEnumerable < T>。編譯器這樣說。

要得到相同的結果,您的第一條語句,你需要無參數的SingleOrDefault:

IEnumerable<UserOfferUsed> mySequence = objEntity.UserOfferUseds 
    .Where(TBL => TBL.UserID == UserID); 
UserOfferUsed objUserUsed = mySequence.SingleOrDefault(); 

或者,如果你想這樣做在一個聲明:

UserOfferUsed objUserUsed = objEntity.UserOfferUseds 
    .Where(TBL => TBL.UserID == UserID) 
    .SingleOrDefault(); 

如果你看看像First/Single/Any/All這樣的函數,它們不會返回一個序列,而是序列中的一個元素,您會發現一個帶有參數和無參數版本的版本。帶參數的函數作爲使用Where與參數其次是參數的功能相同的效果:

var result = SomeSequence.Last(x => SomeFunction(x)) 

返回序列的相同的​​項目爲:

var result = SomeSequence.Where(x => SomeFunction(x)).Last(); 
+0

非常感謝你的好評。 –