I have simple database with many to many relations.
I wrote simple method GetAuthors()
[HttpGet]
public JsonResult GetAuthors()
{
var books = db.Authors
.Where(c => c.Name == "FirstAuthor")
.Include(b => b.AuthorsBooks)
.Select(p => new
{
author = p.Name,
books = p.AuthorsBooks.Select(z => z.Book.Name)
})
.ToList();
return new JsonResult(books);
}
that returns expected result.
[{"author":"FirstAuthor","books":["GoodBook1","GoodBook2","GoodBook3"]}]
The main question how to simplify LINQ in funtion GetAuthors() currently it looks over complicated. Maybe exist other way to simplify with StoredProcedure? how to improve it?
Controller code:
namespace DataFromMSSQL.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private readonly StrangeContext db;
public ValuesController(StrangeContext context)
{
db = context;
}
[HttpGet]
public JsonResult GetAuthors()
{
var books = db.Authors
.Where(c => c.Name == "FirstAuthor")
.Include(b => b.AuthorsBooks)
.Select(p => new
{
author = p.Name,
books = p.AuthorsBooks.Select(z => z.Book.Name)
})
.ToList();
return new JsonResult(books);
}
}
}
Data base script
/****** Object: Table [dbo].[Authors] Script Date: 5/11/2019 10:24:25 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Authors](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](30) NULL,
CONSTRAINT [PK_Versions] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[AuthorsBooks] Script Date: 5/11/2019 10:24:25 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AuthorsBooks](
[Id] [int] IDENTITY(1,1) NOT NULL,
[AuthorId] [int] NOT NULL,
[BookId] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[Books] Script Date: 5/11/2019 10:24:25 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Books](
[Id] [int] NOT NULL,
[Name] [nvarchar](30) NULL,
PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Authors] ON
INSERT [dbo].[Authors] ([Id], [Name]) VALUES (1, N'FirstAuthor')
INSERT [dbo].[Authors] ([Id], [Name]) VALUES (2, N'SecondAuthor')
SET IDENTITY_INSERT [dbo].[Authors] OFF
SET IDENTITY_INSERT [dbo].[AuthorsBooks] ON
INSERT [dbo].[AuthorsBooks] ([Id], [AuthorId], [BookId]) VALUES (1, 1, 1)
INSERT [dbo].[AuthorsBooks] ([Id], [AuthorId], [BookId]) VALUES (2, 1, 2)
INSERT [dbo].[AuthorsBooks] ([Id], [AuthorId], [BookId]) VALUES (3, 1, 3)
INSERT [dbo].[AuthorsBooks] ([Id], [AuthorId], [BookId]) VALUES (4, 2, 1)
INSERT [dbo].[AuthorsBooks] ([Id], [AuthorId], [BookId]) VALUES (5, 2, 3)
SET IDENTITY_INSERT [dbo].[AuthorsBooks] OFF
INSERT [dbo].[Books] ([Id], [Name]) VALUES (1, N'GoodBook1')
INSERT [dbo].[Books] ([Id], [Name]) VALUES (2, N'GoodBook2')
INSERT [dbo].[Books] ([Id], [Name]) VALUES (3, N'GoodBook3')
ALTER TABLE [dbo].[AuthorsBooks] WITH CHECK ADD FOREIGN KEY([AuthorId])
REFERENCES [dbo].[Authors] ([Id])
GO
ALTER TABLE [dbo].[AuthorsBooks] WITH CHECK ADD FOREIGN KEY([BookId])
REFERENCES [dbo].[Books] ([Id])
GO
/****** Object: StoredProcedure [dbo].[GetBooksByAuthor] Script Date: 5/11/2019 10:24:26 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[GetBooksByAuthor]
AS
Select authors.Name, books.Name from dbo.Authors authors
INNER JOIN dbo.AuthorsBooks authorsBooks on authors.Id=authorsBooks.AuthorId
INNER JOIN dbo.Books books on books.Id=authorsBooks.BookId
GO
USE [master]
GO
ALTER DATABASE [Strange] SET READ_WRITE
GO
