2016-06-29 100 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

非常感谢你的好评。 –