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

时间:2018-02-13 17:38:28

标签: c# entity-framework linq

我的数据库中有一个名为 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”类型的常量值。   此处仅支持原始类型或枚举类型   上下文。

2 个答案:

答案 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

但我仍然不确定究竟是什么问题,如果有人理解并且可以在评论中解释,那将会很有用。