C# EF-无法创建类型的常量值此上下文中仅支持基元类型或枚举类型

C# EF-无法创建类型的常量值此上下文中仅支持基元类型或枚举类型,c#,entity-framework,linq,C#,Entity Framework,Linq,我的数据库中有一个名为PickupLocations的表,该表包含externalID和Status列。我从api中获得了一个lockerID的列表 DataBase:PickupLocations API _________________ LockerID |ExternalID| Status| |"789"| --------------------| |"AA1"| | "123" | 1 | |"1

我的数据库中有一个名为PickupLocations的表,该表包含externalIDStatus列。我从api中获得了一个lockerID的列表

DataBase:PickupLocations       API
_________________           LockerID
|ExternalID|  Status|       |"789"|
--------------------|       |"AA1"|
|     "123" |  1    |       |"123"|
|     "456" |  1    |       |"665"|
|     "789" |  1    |       |"555"|
我想做的是将未从api接收的行的状态更改为0

例如:

在此场景中,只有“456”未从api收到,因此应将其状态更新为0

DataBase:PickupLocations       API
_________________           LockerID
|ExternalID|  Status|       |"789"|
--------------------|       |"AA1"|
|     "123" |  1    |       |"123"|
|     "456" |  1    |       |"665"|
|     "789" |  1    |       |"555"|
如果这是SQL,我会这样做:

Update PickupLocations set status = 0 
where ExternalID in
(
 select pl.ExternalID 
 from pickuplocations pl left join LockerIDs l on pl.ExternalID = l.LockerID 
 where l.LockerID is null
)
我试图在代码中实现此SQL更新,但没有成功:

List<LockerList> activeLockers = results.LockerList;
using (var dbc = new MyDBContext())
{
    //First attemp
    dbc.PickupLocations.Where(pl => !activeLockers.Select(x => x.LockerId).Any(l => l.Contains(pl.ExternalID))).ToList().ForEach(x => x.Status = 0);
    //Second attemp
    dbc.PickupLocations.Where(pl => !activeLockers.Any(l => l.LockerId == pl.ExternalID))
                                   .ToList()
                                   .ForEach(x => x.Status = 0);
    dbc.SaveChanges();
}
List activeLockers=results.LockerList;
使用(var dbc=new MyDBContext())
{
//第一次尝试
dbc.PickupLocations.Where(pl=>!activeLockers.Select(x=>x.LockerId).Any(l=>l.Contains(pl.ExternalID)).ToList().ForEach(x=>x.Status=0);
//第二次尝试
dbc.PickupLocations.Where(pl=>!activeLockers.Any(l=>l.LockerId==pl.ExternalID))
托利斯先生()
.ForEach(x=>x.Status=0);
dbc.SaveChanges();
}
两次尝试均出现错误:

无法创建“BoxitObjects.LockerList”类型的常量值。 此类型中仅支持基元类型或枚举类型 上下文

试试这个:

List<int> activeLockers = results.LockerList.Select(al => al.LockerId).ToList();
using (var dbc = new MyDBContext())
{
    dbc.PickupLocations.Where(pl => !activeLockers.Contains(pl.ExternalID)).ToList().ForEach(x => x.Status=0);

    dbc.SaveChanges();
}
List-activeLockers=results.LockerList.Select(al=>al.LockerId.ToList();
使用(var dbc=new MyDBContext())
{
其中(pl=>!activeLockers.Contains(pl.ExternalID)).ToList().ForEach(x=>x.Status=0);
dbc.SaveChanges();
}

这应该是可行的,但这取决于你的错误是什么。尝试此操作,如果出现错误,请发布错误。

以这种方式运行时:

dbc.PickupLocations.Where(pl => pl.ShippingProfileCountryID != 796 && !activeLockers.Select(al => al.LockerId).ToList().Contains(pl.ExternalID))
                                   .ToList()
                                   .ForEach(x => x.Status = 0);

dbc.SaveChanges();
我得到这个错误:

无法创建仅为基元类型或类型的常量值 在此上下文中支持枚举类型

但它是这样工作的:

var activeLockersIDs = activeLockers.Select(al => al.LockerId).ToList();
dbc.PickupLocations.Where(pl => pl.ShippingProfileCountryID != 796 && !activeLockersIDs.Contains(pl.ExternalID))
                                   .ToList()
                                   .ForEach(x => x.Status = 0);

dbc.SaveChanges();
我在这里看到了这个错误:


但我仍然不确定到底是什么问题,如果有人理解并能在评论中解释,最好知道。

愿意分享你遇到的错误吗?
每个人都会给我一个不同的错误。
在你试图比较
LockerId
列表和
ExternalID
的第一个列表时提供错误文本,这没有意义(因此出现了一个错误)。在第二个变量上,
l
lambda变量是一个
LockerId
项,而不是一个列表,因为您在上面运行
.Any()
(除非
LockerId
本身是一个列表,在这种情况下,您希望
SelectMany()
将列表展平)因此,请尝试将其更改为类似以下内容:
dbc.PickupLocations.Where(pl=>!activeLockers.Select(x=>x.LockerId).Any(l=>l==ExternalID)).ToList().ForEach(x=>x.Status=0);
(由于您没有提供实际错误,我现在只是在猜测)除了已经说过的所有其他内容之外,您不能在
ForEach
中返回任何内容,因为它将
操作
作为参数,这是无效的。使用
列表的动机是什么。ForEach
而不是
ForEach
关键字?大多数人认为
ForEach
更具可读性。拆分您的141个字符行可能是有益的。在您的回答中,我遇到了以下错误:
其他信息:无法创建“BoxitObjects.LockerList”类型的常量值。此上下文中仅支持基本类型或枚举类型。
只有在我添加了保存锁定器ID列表的变量后,它才能正常工作。我的解决方案does创建一个锁ID列表。请参见第1行。它只在一个步骤中完成所有操作。您是否执行了其他操作?当我将变量
ActiveLockerId
替换为它的值
activeLockers.Select(al=>al.LockerId).ToList()时
在lambda表达式中,我得到了错误,但当我将其保存为变量时,它就起作用了。我在某个地方读到了与内存相关的问题。。