C# 使用DateTime和path中的双变量进行web api搜索

C# 使用DateTime和path中的双变量进行web api搜索,c#,asp.net,json,C#,Asp.net,Json,我正在开发一个web api,我需要能够搜索带有DateTime的路径,并接收包含该Date的所有书籍 例如/api/books/published/2012返回日期为2012的所有内容。 以及api/books/published/2012/8/15返回所有2012-08-15版本 我试过了 public ActionResult GetBooksSortedByDate() { if (!_bookList.Any()) return Not

我正在开发一个web api,我需要能够搜索带有
DateTime
的路径,并接收包含该
Date
的所有书籍

例如
/api/books/published/2012
返回日期为2012的所有内容。 以及
api/books/published/2012/8/15
返回所有2012-08-15版本

我试过了

 public ActionResult GetBooksSortedByDate()
    {
        if (!_bookList.Any())
            return NotFound();
        return Ok(_bookList);
    }
    [HttpGet("published/{published}")]
    public IActionResult GetBookByDate(DateTime published)
    {
        var book = FindBookByDate(published);
        if (book is null) return NotFound();
        return Ok(book);
    }
    //returnerar böcker innehållandes sökt datum
    private IEnumerable<Book> FindBookByDate(DateTime published)
    {
        return _bookList.Where(_bookList => _bookList.Publish_date.Equals(published));
    }
同样的情况,我在
/api/books/price/33.0
上得到了结果,但我不知道如何在30.0和35.0之间计算价格

我的代码看起来像这样。我想我需要寄两张双人票来检查两张

  //Visar /price/value&value
    [HttpGet("price/{price}&{price}")]
    public IActionResult GetBooksByTwoPrices(double firstPrice, double secondPrice)
    {
        var book = FindBooksByTwoPrices(firstPrice,secondPrice);
        if (book is null) return NotFound();
        return Ok(book);
    }
    
    private IEnumerable<Book> FindBooksByTwoPrices(double firstPrice, double secondPrice)
    {
        var allBooksBetweenPrices = _bookList.Where(_bookList => _bookList.Price.Equals(firstPrice) && _bookList.Price.Equals(secondPrice);
        return allBooksBetweenPrices;
        //return _bookList.Where(_bookList => _bookList.Price.Equals(price));
    }
//Visar/price/value&value
[HttpGet(“price/{price}&{price}”)]
public IActionResult GetBooksByTwoPrices(双倍第一价格,双倍第二价格)
{
var账簿=FindBooksByTwoPrices(第一价格、第二价格);
如果(book为null),则返回NotFound();
返回Ok(书本);
}
private IEnumerable FindBooksByTwoPrices(双倍第一价格,双倍第二价格)
{
var allBooksBetweenPrices=\u bookList.Where(\u bookList=>\u bookList.Price.Equals(firstPrice)和&u bookList.Price.Equals(secondPrice);
返回所有介于价格之间的书籍;
//返回_bookList.Where(_bookList=>_bookList.Price.Equals(Price));
}
我知道我的
var allBooksBetweenPrices=…
不起作用,因为它不能同时是2个值,但我想这是接近它的一种方式


值得注意的是…我的Book.cs只包含
公共双倍价格{get;set;}
我需要另一本来检查其他价格吗?

对于你问题的第一部分,我建议如下:

_bookList.Where(_bookList => _bookList.Publish_date.ToString("yyyy-MM-dd").Contains(published));
var allBooksBetweenPrices = _bookList.Where(_bookList => (_bookList.Price >= firstPrice) && (_bookList.Price <= secondPrice));
对于第二部分,您可以执行以下操作:

_bookList.Where(_bookList => _bookList.Publish_date.ToString("yyyy-MM-dd").Contains(published));
var allBooksBetweenPrices = _bookList.Where(_bookList => (_bookList.Price >= firstPrice) && (_bookList.Price <= secondPrice));

var allBooksBetweenPrices=\u bookList.Where(\u bookList=>(\u bookList.Price>=firstPrice)&&(\u bookList.Price为什么
2012-8-15
作为
DateTime
2012
不起作用,是因为model binder试图将路由参数
string
解析为
DateTime
,而
2012
不是有效的日期时间字符串。您可以使用
DateTime.parse()自行查看。)
method。另外,基于路由的参数是必需的吗?如果不是,那么我建议接受查询中的参数,这将使您的生活更加轻松,例如,您可以有多个参数。请阅读更多信息。@Prolog我一直试图理解基于路由的参数,但似乎每次都弄错了。可以吗例如,在我的代码中显示它应该是什么样子?用一个较小的示例可能更容易理解..至于DateTime…我在哪里做
DateTime.Parse()
?您使用的是ASP.NET Core还是ASP.NET?请指定您使用的框架版本。如果您不知道,请参阅。@Prolog我使用的是ASP.NET 5。它应该是ASP.NET 5.0 Core,但我在创建新项目时没有,我注意到它太晚了。感谢您的贡献。在第一部分,我只得到了一个参数
不能从'system.DateTime'转换为'char'
我真的不明白需要什么字符..?对于第二部分,我实际如何设置该方法?
firstPrice和secondPrice
都有0的值,可以说它们没有收到任何值。这是因为我的
Book.cs
只包含1`公共双倍价格吗{get;set;}`?这是因为我不知道您当时已经将字符串解析为DateTime。
.Contains()
需要一个字符串/字符数组,而不是日期时间。我阅读了您的想法,得出结论,您正在使用字符串来定义日期。我认为我们应该有不同的方法,一种是比较准确的日期,另一种是做一整年的时间跨度,如果我没有误解您的话……澄清一下。
api/books/published/2012
returns 2012年的所有书籍同时
/api/books/published/2012/8/15
返回2012-08-15年的所有书籍。看起来好像my
DateTime
变量设置为“2012-08-01”当我编写
api/books/published/2012-08
时,是否可以将
published/value
作为
字符串
,并将其作为
日期时间
返回?这样我就可以使用
包含()
?您仍然有点困惑:现在是/2021/8/16还是2015-8-15?当2021转换为2021-01-01My bad时,您不能使用这样的contains。它希望能够使用PRODUCTED/2015/8/15作为访问在该日期创建的书籍的路径。同时,能够使用PRODUCTED/2015作为访问所有cre书籍的路径那一年他被解雇了。