multiple parameters passing with method overloadin

2019-07-27 00:28发布

I have following methods in Repository Class

    public class LibraryRepository : IBookRepository
    {
        LibraryContext context = new LibraryContext();

        public decimal findBookPrice(int book_id)
        {
            var bookprice = (
                            from r in context.Books
                            where r.Book_Id == book_id
                            select r.Price
                            ).FirstOrDefault();

            return bookprice;

        }

        public decimal findBookPrice(int book_id, string bookname)
        {
            var bookprice = (
                             from book in context.Books
                             where book.Book_Id == book_id & book.Book_Title == bookname
                             select book.Price
                             ).FirstOrDefault();

            return bookprice;

        }  

    }

Then I'm trying to get those two methods separately in Web API

    public class BooksWithAuthersController : ApiController
    {

        private LibraryRepository db = new LibraryRepository();

        // GET: api/BooksWithAuthers/id/Price  

        [ResponseType(typeof(decimal))]
        [Route("api/BooksWithAuthers/{id}/Price")]
        public IHttpActionResult GetBooksPriceById(int id)
        {
            decimal bookprice = db.findBookPrice(id);

            return Ok(bookprice);
        }

        // GET: api/BooksWithAuthers/id,name/Price

        [ResponseType(typeof(decimal))]
        [Route("api/BooksWithAuthers/{id,name}/Price")]
        public IHttpActionResult GetBooksPriceById(int id,string name)
        {
            decimal bookprice = db.findBookPrice(id,name);

            return Ok(bookprice);
        }
    }

Here first method working fine, but How can I handle scenario with multiple parameters

enter image description here

2条回答
爱情/是我丢掉的垃圾
2楼-- · 2019-07-27 01:07

I am not sure if this {id,name} is even possible.You are getting the exception because routing module is reading 5,test as single attribute and is not able serialize it to int for method

public IHttpActionResult GetBooksPriceById(int id)

You need to change your methods as below considering nullable types (int?) and also change the route

[ResponseType(typeof(decimal))]
[Route("api/BooksWithAuthers/{id}/Price")]
public IHttpActionResult GetBooksPriceById(int? id)
{
   decimal bookprice = db.findBookPrice(id);
   return Ok(bookprice);
}


[ResponseType(typeof(decimal))]
[Route("api/BooksWithAuthers/{id}/{name}/Price")]
public IHttpActionResult GetBooksPriceById(int? id,string name = null)
{
    decimal bookprice = db.findBookPrice(id,name);

    return Ok(bookprice);
}

Reference - https://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx

查看更多
Juvenile、少年°
3楼-- · 2019-07-27 01:12

Set your parameter as a nullable type like below:

public class LibraryRepository : IBookRepository, I
    {
        LibraryContext context = new LibraryContext();

        public decimal findBookPrice(int book_id=0)
        {
            var bookprice = (
                            from r in context.Books
                            where r.Book_Id == book_id
                            select r.Price
                            ).FirstOrDefault();

            return bookprice;

        }

        public decimal findBookPrice(int book_id=0, string bookname=null)
        {
            var bookprice = (
                             from book in context.Books
                             where book.Book_Id == book_id & book.Book_Title == bookname
                             select book.Price
                             ).FirstOrDefault();

            return bookprice;

        }  

    }

and set a condition simply to check nullable parameter like below:

if(book_id!=0)
{
    // do your logic here
}
if(!string.IsNullOrEmpty(bookname))
{
   // do your logic here
}

Hope this will help you

Thanks

查看更多
登录 后发表回答