我是使用lambda表达式的LINQ查询表达式的新手。我有一个方法,我想通过它来更新另一个表中的值。它在单个或默认情况下工作得很好,但当我使用Where条件时就不行了。
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;
}
}
错误:不能隐式转换类型"来。这个IQueryable"Database.UserOfferUsed"。存在显式转换(是吗?)
.Where
将在这里返回IQueryable
,使用.SingleOrDefault
或.FirstOrDefault
来获得结果(如果所需的结果只有一个项目)。如果结果包含多个元素,则可以使用.ToList()
。如果是这样,你必须将objUserUsed
更改为List<UserOfferUsed>
,也就是说,你的代码将像这样:
UserOfferUsed objUserUsed = objEntity.UserOfferUseds.FirstOrDefault(TBL => TBL.UserID == UserID);
或Like this
List<UserOfferUsed> objUserUsed = objEntity.UserOfferUseds.Where(TBL => TBL.UserID == UserID).ToList();
您可以根据您的要求选择上述一种;
Update:如果UserID
对于列表中的每个元素都是唯一的,那么.FirstOrDefault()
将是最好的选择,因为查询不会给出多个结果(您也必须考虑null
,因为FirstOrDefault()
如果没有找到指定的匹配,将给出null)。如果你使用列表,你想要更新这些值意味着你可以这样做:
foreach(var objUserUsed in objEntity.UserOfferUseds.Where(TBL => TBL.UserID == UserID))
{
objUserUsed.UsedCoupon = 0;
}
linq语句作用于可枚举的序列。这意味着你可以说:give me the first。和:我有这个,给我下一个。
大多数linq操作符返回IEnumerable
换句话说:只要你的语句返回序列,代码就不是真正枚举的。
如果你查找SingleOrDefault,你会看到返回值是一个t。为了计算返回值,序列被枚举。
Enumerable的返回值。这里不是T,而是IEnumerable
要获得与第一个语句相同的结果,您需要无参数的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这样的函数,Linq函数不返回序列,只返回序列的一个元素,你会发现一个有参数的版本和一个无参数的版本。带参数的函数与使用Where带参数,后跟无参数函数的效果相同:
var result = SomeSequence.Last( x => SomeFunction(x))
返回序列中与
相同的项:var result = SomeSequence.Where( x => SomeFunction(x)).Last();