EF Core 对 SQL 请求的正确解释
Correct interpretation of SQL request by EF Core
我在数据库中有一个table存储以下对象:
public partial class Invoice
{
public string DocumentNumber { get; set; }
public DateTime? DocumentDate { get; set; }
public string DocumentReference { get; set; }
public string SerialNumber { get; set; }
public string ProductCode { get; set; }
public string Description { get; set; }
public string Certificate { get; set; }
public string Language { get; set; }
public string Email { get; set; }
}
我也有一个查询returns我的具体元素的数量:
SELECT Count(*)
FROM (
SELECT DocumentNumber,DocumentDate,DocumentReference
FROM vInvoiceSwivelInfoWeb
WHERE Email = 'someemail@gmail.com' AND Language = 'FR'
GROUP BY DocumentNumber,DocumentDate,DocumentReference
) AS T
答案看起来像这样:
如何使用EF发出这样的请求并得到一个数字的答案?
我试过这样:
_context.Database.ExecuteSqlRawAsync($"..some SQL query..")
但我没有得到预期的结果。
UPD: 收到关于无法通过 EF 完成此请求的答复后,合理地提出了以下问题:是否可以使用LINQ?
您可以通过 Context.Database
属性 利用 ADO.NET
。
遗憾的是,如果您有与您的实体无关的自定义查询,则无法使用 EF Core 执行方法从数据库中获取计数。
using (var command = context.Database.GetDbConnection().CreateCommand())
{
command.CommandText = "SELECT Count(*) From Table1";
context.Database.OpenConnection();
using (var result = command.ExecuteReader())
{
// do something with result
}
}
更新问题
var count = from a in _context.vInvoiceSwivelInfoWeb
where a.Email == "someemail@gmail.com" && a.Language == "FR"
group new { a.DocumentNumber , a.DocumentReference , a.DocumentDate } by a into g
select g.Count()
此外,了解您使用的是哪个版本的 EF-Core 也很重要:
目前,如果您使用的是 EF-Core 3,group-by
不会转换为 SQL 命令,因此您必须在客户端执行此操作:
对于 EF-Core 3.0 - 3.1.1
var count = _context.vInvoiceSwivelInfoWeb
.Where(a => a.Email == "someemail@gmail.com" && a.Language == "FR" ).ToList()
.GroupBy(a => new { a.DocumentNumber ,a.DocumentDate, a.DocumentReference }).Count();
我在数据库中有一个table存储以下对象:
public partial class Invoice
{
public string DocumentNumber { get; set; }
public DateTime? DocumentDate { get; set; }
public string DocumentReference { get; set; }
public string SerialNumber { get; set; }
public string ProductCode { get; set; }
public string Description { get; set; }
public string Certificate { get; set; }
public string Language { get; set; }
public string Email { get; set; }
}
我也有一个查询returns我的具体元素的数量:
SELECT Count(*)
FROM (
SELECT DocumentNumber,DocumentDate,DocumentReference
FROM vInvoiceSwivelInfoWeb
WHERE Email = 'someemail@gmail.com' AND Language = 'FR'
GROUP BY DocumentNumber,DocumentDate,DocumentReference
) AS T
答案看起来像这样:
如何使用EF发出这样的请求并得到一个数字的答案? 我试过这样:
_context.Database.ExecuteSqlRawAsync($"..some SQL query..")
但我没有得到预期的结果。
UPD: 收到关于无法通过 EF 完成此请求的答复后,合理地提出了以下问题:是否可以使用LINQ?
您可以通过 Context.Database
属性 利用 ADO.NET
。
遗憾的是,如果您有与您的实体无关的自定义查询,则无法使用 EF Core 执行方法从数据库中获取计数。
using (var command = context.Database.GetDbConnection().CreateCommand())
{
command.CommandText = "SELECT Count(*) From Table1";
context.Database.OpenConnection();
using (var result = command.ExecuteReader())
{
// do something with result
}
}
更新问题
var count = from a in _context.vInvoiceSwivelInfoWeb
where a.Email == "someemail@gmail.com" && a.Language == "FR"
group new { a.DocumentNumber , a.DocumentReference , a.DocumentDate } by a into g
select g.Count()
此外,了解您使用的是哪个版本的 EF-Core 也很重要:
目前,如果您使用的是 EF-Core 3,group-by
不会转换为 SQL 命令,因此您必须在客户端执行此操作:
对于 EF-Core 3.0 - 3.1.1
var count = _context.vInvoiceSwivelInfoWeb
.Where(a => a.Email == "someemail@gmail.com" && a.Language == "FR" ).ToList()
.GroupBy(a => new { a.DocumentNumber ,a.DocumentDate, a.DocumentReference }).Count();