我的数据库中有一个名为 PickupLocations 的表,其中列 externalID 和状态。我从api获得了 LockerIDs 的列表。
我想要做的是将未从api收到的行的状态更改为0.
E.g:
在这种情况下,未从api收到“ 456 ”,因此应将状态更新为 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();
}
两次尝试均出错:
无法创建“BoxitObjects.LockerList”类型的常量值。 此处仅支持原始类型或枚举类型 上下文。
答案 0 :(得分:2)
试试这个:
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();
}
这应该有效,但这取决于你的错误。试试这个,如果你拿到错误就发布错误。
答案 1 :(得分:0)
当我以这种方式运行时:
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();
我在这里读到了这个错误:
Unable to create a constant value of type Only primitive types or enumeration types are supported in this context
但我仍然不确定究竟是什么问题,如果有人理解并且可以在评论中解释,那将会很有用。