Как вернуть данные из разных таблиц, используя Sql Query в EF Core, без использования табличных функций / Linq - PullRequest
0 голосов
/ 06 февраля 2020

Как выбрать данные из двух таблиц, используя запрос SQL, используя ядро ​​ef. Ниже приведены две таблицы

 public class Category
    {
        public int Id { get; set; } // Don't want to return this.
        public string Name { get; set; } // Only want to return this.
    }

public class Product
{
    public int ProductId {get;set;}
    public string Name { get; set; }
    public int CategoryId {get;set;}
}

Я хочу выполнить Select P.Name , C.Name from tblCategory C JOIN tblProduct P ON C.Id = P.CategoryId в ядре инфраструктуры сущностей.

Один из вариантов - использовать функции с табличными значениями, но я не хочу это рассматривать? Я не хочу использовать linq, потому что сгенерированный sql не эффективен. Выше приведен пример, а не реальный сценарий.

Ответы [ 3 ]

1 голос
/ 06 февраля 2020

Если вы хотите сделать это, используя EF Core вместо ADO. NET или Dapper, вы можете использовать необработанные Sql Запросы, как показано ниже:

Пример EF Core 2.1:

var blogs = context.Blogs
    .FromSql("SELECT * FROM dbo.Blogs")
    .ToList();

В EF Core 3.1 FromSql устарел, поэтому используйте FromSqlRaw

var blogs = context.Blogs
    .FromSqlRaw("SELECT * FROM dbo.Blogs")
    .ToList();

Аналогично, ваш запрос может быть выполнен как

var results = context.ProductCategories.FromSqlRaw(Select P.Name as ProductName, C.Name as CategoryName from tblCategory C JOIN tblProduct P ON C.Id = P.CategoryId)

Примечание: Кроме того, вы необходимо определить ProductCategories в классе контекста.

public DbQuery<ProductCategory> ProductCategories { get; set; }

ProductCategory.cs

public class ProductCategory
{
    public string ProductName { get; set; }
    public string CategoryName { get; set; }
}

Здесь, ProductCategory называется EF Core 2.1 как тип запроса. В EF Core 3.0 концепция была переименована в типы ключей без ключей. Он служит типом возврата для необработанных Sql запросов.

. Для получения более подробной информации см. docs.microsoft.com

0 голосов
/ 06 февраля 2020

В EF вы обычно не используете необработанный запрос SQL для чего-то такого простого.

Вместо этого добавьте Свойство навигации для перехода из Продукта в категорию:

public class Category
{
     public int Id { get; set; } // Don't want to return this.
     public string Name { get; set; } // Only want to return this.
}

public class Product
{
    public int ProductId {get;set;}
    public string Name { get; set; }
    public Category Category {get;set;}
    public int CategoryId {get;set;}
}

Затем вы можете написать запрос LINQ, например

from p in db.Product
   select new {ProductName = p.Name, CategoryName = p.Category.Name };

. В Code-First это также гарантирует, что вы не сможете получить продукт, у которого CategoryId не является идентификатором какой-либо категории, создав Внешний ключ в базе данных и (по крайней мере для SQL Server) создание некластеризованного индекса для Product.CategoryId для повышения производительности.

0 голосов
/ 06 февраля 2020

Вы можете просто выполнить оператор SQL с нужным запросом:

using (var connection = new SqlConnection(_ConnectionString))
{
    connection.Open();
    {
       string query = @"select P.Name, C.Name from tblCategory C JOIN P ON C.Id=P.CategoryId";
       result = (await connection.QueryAsync<MyDto>(query)).ToList();
     }
}
...