我将一个整数数组传递给一个API端点,该端点由模型组成,如:
public class SomeModel {
public IList<int> ints { get; set; }
}
我要点击的终点是:
Get["/myobjects/{id:int}"] = _ =>
{
var ints = this.Bind<SomeModel>();
return myService.someMethod1((int)_.id, ints.Ints));
};
然后,当我想查询数据库中的对象时,
var count = context.ReadOnly<SomeModel>()
.Query(x => x.myId == id && // id is already defined
ints != null &&
ints.Contains(x.SomeModelId))
.Select(x => x.Id)
.Count();
我使用Entity Framework作为ORM。
无法创建类型为'System.Collections.Generic.IList`1 [[System.Int32,mscorlib,Version = 4.0.0.0,Culture = neutral]]'的null常量值。
或者我得到:
无法比较'System.Collections.Generic.IList`1 [[System.Int32,mscorlib,Version = 4.0.0.0,Culture = neutral]'类型的元素。仅支持基本类型,枚举类型和实体类型。
此上下文仅支持实体类型,枚举类型或基元类型。
异常表明它不能创建一个空的常量值,但是我填充了正在进入的数组 - 所以我不明白它为什么会抛出这个错误。
编辑:未绑定int数组,列表为空。有人知道如何正确绑定到列表吗?
答案 0 :(得分:6)
请记住,您在lamdba中所做的所有检查都是在查询中这意味着EF很可能会尝试将它们评估为SQL。
但是你要检查的是一个不是查询的一部分的变量。如果是这种情况,则需要在查询之外拆分检查。
var query = context.ReadOnly<SomeModel>().Query(x => x.myId == id);
if (ints != null) {
query = query.Where(x => ints.Contains(x.SomeModelId);
}
var count = query.Select(x => x.Id).Count();
如果我理解业务案例,如果ints
为空,则整个查询将评估为false
,因此您最有可能只是检查ints
是否为空 - &GT;如果为真,则计数为零。否则 - 查询数据库。
var count = 0;
if (ints != null)
{
count = context.ReadOnly<SomeModel>()
.Query(x => x.myId == id &&
ints.Contains(x.SomeModelId))
.Select(x => x.Id)
.Count();
}