【问题标题】:Entity Framework passing array of integers to endpoint实体框架将整数数组传递给端点
【发布时间】:2016-04-10 18:13:01
【问题描述】:

我将一个整数数组传递给一个由模型组成的 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();

我使用实体框架作为 ORM。

无法创建类型为“System.Collections.Generic.IList`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral]]”的空常量值。

或者我得到:

无法比较“System.Collections.Generic.IList`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral]”类型的元素。仅支持原始类型、枚举类型和实体类型。

在此上下文中仅支持实体类型、枚举类型或原始类型。

异常表明它无法创建空常量值,但我正在填充传入的数组 - 所以我不明白它为什么会抛出这个错误。

编辑:整数数组未绑定,列表为空。有人知道如何正确绑定到列表吗?

【问题讨论】:

  • 这不是 EntityFramework 问题,因为您发现您的 ints 对象未正确绑定。您还应该使用 MVC Next(或任何 MVC 6 标记)进行标记,因为新版本中的绑定不同。

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


【解决方案1】:

请记住,您在 lamdba 中所做的所有检查都在查询中,这意味着 EF 很可能会尝试将它们评估为 SQL。

但是您要检查的是一个不属于查询的变量。如果是这种情况,则需要在查询之外拆分对 null 的检查。

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 是否为空 -> 如果为真,则计数为零。否则 - 查询数据库。

var count = 0;
if (ints != null)
{
    count = context.ReadOnly<SomeModel>()
                .Query(x => x.myId == id &&
                    ints.Contains(x.SomeModelId))
                .Select(x => x.Id)
                .Count();
}

【讨论】:

  • 感谢您帮助我找到了一个错误,即列表本质上为空。我编辑了描述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 2019-01-22
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多