LINQ lambda表达式中的条件



我是使用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 ,意味着它返回另一个序列。在执行foreach之类的操作或执行linq语句之前,序列不会被枚举,除非该linq语句不返回IEnumerable 但是T

换句话说:只要你的语句返回序列,代码就不是真正枚举的。

如果你查找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();

相关内容

  • 没有找到相关文章

最新更新