实体框架将整数数组传递给端点

时间:2016-04-10 18:13:01

标签: c# asp.net .net entity-framework

我将一个整数数组传递给一个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数组,列表为空。有人知道如何正确绑定到列表吗?

1 个答案:

答案 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();
}