【问题标题】:WEB API IQueryable skip() take()WEB API IQueryable skip() take()
【发布时间】:2018-06-20 17:29:15
【问题描述】:

所以我想在 C# ASP.NET Web Api 中分割一个“IQueryable”,但我无法让它工作。使用下面的代码可能会更清楚我想要做什么。

private TestTwoContext db = new TestTwoContext();


// GET: api/Fruits/thefruits
[HttpGet]
[Route("api/Fruits/thefruits")]
public IQueryable<Fruits> TheFruits()
{
    dynamic myList = db.Fruits;
    var FiveItems = Queryable.Take(Queryable.Skip(myList, 5), 5);
    return FiveItems;
}

这在浏览器控制台中给了我错误:

jquery-3.3.1.min.js:2 GET http://localhost:49771/api/Fruits/thefruits 500(内部服务器错误)

我需要将我的列表 (db.Fruits) 从第 5 个元素剪切到第 10 个元素。 就像我们在 JavaScript 中对数组进行切片一样。 示例:

var myList = array.slice(5, 10)

我也试过这个:

private TestTwoContext db = new TestTwoContext();


// GET: api/Fruits/thefruits
[HttpGet]
[Route("api/Fruits/thefruits")]
public IQueryable<Fruits> TheFruits()
{
    var myList = db.Fruits;
    var FiveItems = myList.Skip(5).Take(4);
    return FiveItems;
}

这给了我浏览器控制台中的错误: jquery-3.3.1.min.js:2 GET http://localhost:49771/api/Fruits/thefruits 500(内部服务器错误)

skip 和 take 中的数字将作为参数传递,但这不是我担心的部分……这些数字现在只是示例。任何帮助将不胜感激。

这个控制器可以正常工作:

// GET: api/Fruits
public IQueryable<Fruits> GetFruits()
{
    return db.Fruits;
}

返回整个水果列表,稍后我将其写在 HTML 的表格中。

这也有效:

[HttpGet]
[Route("api/Fruits/thefruits")]
public IQueryable<Fruits> TheFruits()
{
    var myList = db.Fruits;
    var FiveItems = myList.Take(5);
    return FiveItems;
}

但它给了我前 5 个元素...不是从第 5 到第 10 个元素。

【问题讨论】:

  • 请包括您尝试的实际和预期结果。 "It's not working" is not helpful
  • 什么不完全有效? .Skip(x).Take(y) 是一种非常常见的技术。除了你的变量假设你得到 5 个项目,但你只拿了 4 个。
  • 哦,你也不能通过 WebAPI 返回IQueryable。你真的应该返回IEnumerable&lt;Fruits&gt;return FiveItems.ToList();
  • 如果这将基于传入的参数,那么选择是否必须基于索引?或者您可以传递您选择的 Fruit 的特定属性吗?
  • SkipTake 是扩展方法,旨在像类方法一样使用:db.Fruits.Skip(5).Take(5)。另外,为什么myList 是动态的?这并没有提供任何有用的东西,实际上它会损害性能和类型安全。

标签: c# linq asp.net-web-api


【解决方案1】:

如果您发布 500 错误会很好,但作为猜测,这可能是因为 Skip 不能在 EntityFramework 中调用 order by

[HttpGet]
[Route("api/Fruits/thefruits")]
public IQueryable<Fruits> TheFruits()
{
    return db.Fruits.OrderBy(x => x.Id).Skip(4).Take(5);
}

【讨论】:

  • 没问题,随时!
  • 也许是个愚蠢的问题,但如果不想按 ID 订购它们怎么办。如果没有按 id 的顺序,这可以工作吗?
  • 如果你真的不关心订单,你需要一个 order by 子句,只需执行 .OrderBy(x =&gt; 1) 它将为所有返回相同的值
  • @HappyCoconut @johnny5 你可能不关心排序,但不能保证数据库总是以相同的方式读取表。如果它选择以不同的方式读取表格(无论出于何种原因)并且您没有提供正确的顺序,您的 Skip/Take 将返回非连续的子集/页面。因此,如果您不想冒险分页返回随机页面,请不要使用OrderBy(x =&gt; 1)
  • @ckuri 是的,如果您不关心订单,这就是我的意思,但由于副作用,我可能应该进一步澄清一下
【解决方案2】:

试试这个来理解 Skip() 和 Take()。

var list = new List<long>{0,1,2,3,4,5,6,7,8,9};
var secondList = list.AsQueryable().Skip(5).Take(5).ToList();
secondList

Skip(X) -> 它忽略 Iqueryable 上的前 X 个项目

Take(Y) -> 限制最大结果。

输出是:

List<long>(5) { 5, 6, 7, 8, 9 }

【讨论】:

  • 这里为什么有AsQueryable()?我看到它一直在使用,但几乎从不需要。
  • 我只是为了清除它可以用任何实现 IQueryable 的东西来完成
  • public IQueryable GetFruits() { return db.Fruits; } 由实体框架自动生成。
【解决方案3】:

尝试将您的“TheFruits”方法更新为以下内容:

// GET: api/Fruits/thefruits
[HttpGet]
[Route("api/Fruits/thefruits")]
public IQueryable<Fruits> TheFruits()
{
    dynamic myList = db.Fruits;
    var FiveItems = myList.Skip(5).Take(5);
    return FiveItems;
}

示例控制台应用程序:

    using System.Linq;

    static void Main(string[] args)
    {
        int[] test = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };

        var t = test.AsQueryable().Skip(5).Take(5);

        foreach (int i in t)
        {
            Console.WriteLine(i.ToString());
        }

        Console.ReadLine();
    }

【讨论】:

  • 不...仍然相同的错误:jquery-3.3.1.min.js:2 GET localhost:49771/api/Fruits/thefruits 500(内部服务器错误)
  • 你能提供一些错误细节吗?我已经编辑了我的答案以显示一个示例控制台应用程序,它表明这应该适合你。
  • 您粘贴的错误消息似乎表明客户端 JavaScript 存在问题,而不是控制器的操作。我建议调试 Action 的返回值。
  • @Kevin 是什么让您认为 服务器错误 表明客户端存在问题? server 是有错误的。您可以自己运行代码以查看导致向客户端发送 500 错误的实际异常。
【解决方案4】:

这是我必须做的事情:

    [HttpGet]
    [Route("api/Fruits/thefruits")]
     public List<Fruits> TheFruits()
    {

        var myList = db.Fruits;
        var FiveItems = myList.AsEnumerable().Skip(5).Take(5).ToList();
        return FiveItems;

    }

【讨论】:

  • 出于好奇,我想学习,有人能告诉我为什么这是一个糟糕的解决方案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 2018-02-03
  • 2012-06-12
  • 2016-11-10
  • 2011-11-13
  • 1970-01-01
相关资源
最近更新 更多