繁体   English   中英

LINQ lambda表达式中的条件

[英]Where condition in a LINQ lambda expression

我是使用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;
    }
}

错误:无法将类型“ System.Linq.IQueryable”隐式转换为“ Database.UserOfferUsed”。 存在显式转换(您是否缺少演员表?)

.Where会返回一个IQueryable位置,使用.SingleOrDefault.FirstOrDefault得到的结果(如果需要的结果是只有一个项目)。 或者如果结果将包含多个元素,则可以使用.ToList() 如果是这样,则必须将objUserUsed更改为List<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()如果存在FirstOrDefault() null找不到指定的匹配项)。 如果您使用列表,并且想要更新这些值,则可以执行以下操作:

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

linq语句作用于可枚举的序列。 这意味着您可以说:给我第一个。 并且:我有这个,给我下一个。

大多数linq运算符返回IEnumerable <T>,这意味着它返回另一个序列。 在执行诸如foreach之类的操作或执行不返回IEnumerable <T>而是返回T的linq语句之前,该序列不会被枚举

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM