C# LINQ lambda表达式中的Where条件

C# LINQ lambda表达式中的Where条件,c#,.net,entity-framework,linq,linq-to-entities,C#,.net,Entity Framework,Linq,Linq To Entities,我不熟悉使用lambda表达式的LINQ查询表达式。我有一种方法,我想用它更新另一个表中的值。 它在单一或默认情况下运行良好,但在使用Where条件时则不行 public static void UpdateData(int UserID) { using (var objEntity = new DataContext()) { UserMaster objUser = objEntity.UserMasters.SingleOrDefault(TBL =&g

我不熟悉使用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 objUserUsed = objEntity.UserOfferUseds.FirstOrDefault(TBL => TBL.UserID == UserID);
还是像这样

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

.Where
将在此处返回一个
IQueryable
,使用
.SingleOrDefault
.FirstOrDefault
获取结果(如果所需结果仅为单个项目)。或者,如果结果将包含多个元素,则可以使用
.ToList()
。如果是这样,您必须将
objUserUsed
更改为
List
,也就是说,您的代码如下所示:

UserOfferUsed objUserUsed = objEntity.UserOfferUseds.FirstOrDefault(TBL => TBL.UserID == UserID);
还是像这样

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

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

大多数linq运算符返回IEnumerable,这意味着它返回另一个序列。在执行类似于foreach的操作或执行不返回en IEnumerable但返回t的linq语句之前,不会枚举序列

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

如果您查找SingleOrDefault,您将看到返回值是T。要计算返回值,将枚举序列

可枚举的返回值。其中不是T,而是IEnumerable。编译器是这么说的

要获得与第一条语句相同的结果,需要使用无参数SingleOrDefault:

IEnumerable<UserOfferUsed> mySequence = objEntity.UserOfferUseds
    .Where(TBL => TBL.UserID == UserID);
UserOfferUsed objUserUsed = mySequence.SingleOrDefault();
如果您查找像First/Single/Any/All这样的函数,Linq函数不返回序列,而是返回序列的一个元素,那么您将找到一个带有参数的版本和一个无参数的版本。带参数的函数与使用Where带参数后接无参数函数的效果相同:

var result = SomeSequence.Last( x => SomeFunction(x))
返回与以下内容相同的序列项:

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

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

大多数linq运算符返回IEnumerable,这意味着它返回另一个序列。在执行类似于foreach的操作或执行不返回en IEnumerable但返回t的linq语句之前,不会枚举序列

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

如果您查找SingleOrDefault,您将看到返回值是T。要计算返回值,将枚举序列

可枚举的返回值。其中不是T,而是IEnumerable。编译器是这么说的

要获得与第一条语句相同的结果,需要使用无参数SingleOrDefault:

IEnumerable<UserOfferUsed> mySequence = objEntity.UserOfferUseds
    .Where(TBL => TBL.UserID == UserID);
UserOfferUsed objUserUsed = mySequence.SingleOrDefault();
如果您查找像First/Single/Any/All这样的函数,Linq函数不返回序列,而是返回序列的一个元素,那么您将找到一个带有参数的版本和一个无参数的版本。带参数的函数与使用Where带参数后接无参数函数的效果相同:

var result = SomeSequence.Last( x => SomeFunction(x))
返回与以下内容相同的序列项:

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

谢谢你的快速回复。但在得到列表后,如何更新objUserUsed表的列值?因为我需要更新表中的多个新值。。不仅仅是单个或第一个..而不是这个
objUserUsed=objEntity.userofferseds.Where(TBL=>TBL.UserID==UserID).FirstOrDefault()
;我们可以试试这个
objUserUsed=objEntity.userofferseds.FirstOrDefault(TBL=>TBL.UserID==UserID)感谢您的快速回复。但在得到列表后,如何更新objUserUsed表的列值?因为我需要更新表中的多个新值。。不仅仅是单个或第一个..而不是这个
objUserUsed=objEntity.userofferseds.Where(TBL=>TBL.UserID==UserID).FirstOrDefault()
;我们可以试试这个
objUserUsed=objEntity.userofferseds.FirstOrDefault(TBL=>TBL.UserID==UserID)