Использование Entity Framework для возврата очень специфического набора данных из MSSQL - PullRequest
0 голосов
/ 07 ноября 2018

Мне удалось создать веб-сайт .NetCore 2.1 с Enitity Framework, следуя руководству Microsoft.

Веб-приложение подключается к базе данных MS SQL и использует леса для преобразования таблиц базы данных в классы.

Но все, что он делает за кулисами, это простые запросы, такие как «select * from myTable» и т. Д.

Например, у меня есть этот простой контроллер, который просто получает всех игроков в таблице PlayerList:

        // GET: PlayerLists
    public async Task<IActionResult> Index()
    {
        return View(await _context.PlayerList.ToListAsync());
    }

Это немного сложнее, но на самом деле это просто один игрок:

        // GET: PlayerLists/Edit/5
    public async Task<IActionResult> Edit(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var playerList = await _context.PlayerList.FindAsync(id);
        if (playerList == null)
        {
            return NotFound();
        }
        return View(playerList);
    }

Это работает, но мне нужно нечто более сложное, чтобы получить очень специфический набор данных из моей базы данных.

Как добавить запрос, который выполняет очень специфический запрос с объединениями SQL, инструкциями case и предложениями group by?

Спасибо!

1 Ответ

0 голосов
/ 08 ноября 2018

В EF core 2.1 мы используем Linq для запроса данных. Вы можете увидеть, как использовать Joins здесь и group by здесь . Linq-эквивалент transact sql CASE WHEN THEN является условным оператором ?:

Ниже приведено простое демо, которое объединяет их для выполнения запроса:

1.Models

public class Product
{
    [Key]
    public int ProductID { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }

    public int CategoryID { get; set; } 
    public Category Category { get; set; }
}
public class Category
{
    [Key]
    public int CategoryID { get; set; }
    public string Name { get; set; }


    public IList<Product> Products { get; set; }
}

2. Запрос в контроллере

var result = from p in _context.Products
                     group p by p.CategoryID into pg
                     // join *after* group
                     join c in _context.Categories on pg.FirstOrDefault().CategoryID equals c.CategoryID
                     select new
                     {
                         CategoryName = c.Name == "oldName" ? "newName" : c.Name,//Replace Case statement
                         Products = pg
                     };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...