[英]SQL to LINQ (Entity Framework Core)
我正在尝试将 SQL 写入 LINQ。 我试过Linqpad,但是这个功能不可用(只有LINQ到SQL转换)。
我有这个 SQL 查询
SELECT
count(*),
count(TireWidth),
count(TireRimDiameter),
count(TireSeason),
count(PriceCzk)
FROM(
SELECT
CASE WHEN TireWidth = 255 THEN 1 END TireWidth,
CASE WHEN TireRimDiameter = 16 AND TireWidth = 255 THEN 1 END TireRimDiameter,
CASE WHEN TireSeason = 1 THEN 1 END TireSeason,
CASE WHEN PriceCzk > 50000 THEN 1 END PriceCzk
FROM Products
)
Products
如何在 LINQ 中编写此查询? 我正在使用实体框架核心 .NET 核心 5。
谢谢提前
诀窍在于使用group by
by 常量。 EF 将创建简单的聚合查询。
var query =
from p in ctx.Products
group p by 1 into g
select new
{
Count = g.Count(),
TireWidth = g.Sum(x => x.TireWidth == 255 ? 1 : 0),
TireRimDiameter = g.Sum(x => x.TireRimDiameter == 16 && x.TireWidth == 255 ? 1 : 0),
TireSeason = g.Sum(x => x.TireSeason == 1 ? 1 : 0),
PriceCzk = g.Sum(x => x.PriceCzk > 50000 ? 1 : 0)
};
我没有找到 LINQ 解决方案,但是这个解决方案正在运行并且非常快:
var MySqlParameters = new List<MySqlParameter>();
MySqlParameters.Add(new MySqlParameter("p_date", DateTime.UtcNow.Date));
MySqlParameters.Add(new MySqlParameter("p_product_type", (int)(parameters.ProductType ?? 0)));
MySqlParameters.AddRange(BuildInParameters("p_condition",
parameters.Conditions.Select(c => (int)c), out var conditionParameters));
MySqlParameters.AddRange(BuildInParameters("p_brand",
parameters.Brands.Select(c => (int)c), out var brandParameters));
MySqlParameters.AddRange(BuildInParameters("p_seller",
parameters.UserTypes.Select(c => (int)c), out var sellerParameters));
if (parameters.ToMileage != null)
MySqlParameters.Add(new MySqlParameter("p_mileage", parameters.ToMileage));
if (parameters.FromPrice != null)
MySqlParameters.Add(new MySqlParameter("p_from_price", parameters.FromPrice));
if (parameters.ToPrice != null)
MySqlParameters.Add(new MySqlParameter("p_to_price", parameters.ToPrice));
if (parameters.TireSeason != null)
MySqlParameters.Add(new MySqlParameter("p_tire_ses", parameters.TireSeason));
if (parameters.TireVehicleType != null)
MySqlParameters.Add(new MySqlParameter("p_veh_type", parameters.TireVehicleType));
if (parameters.TireWidth != null)
MySqlParameters.Add(new MySqlParameter("p_tire_wid", parameters.TireWidth));
if (parameters.TireHeight != null)
MySqlParameters.Add(new MySqlParameter("p_tire_hei", parameters.TireHeight));
if (parameters.TireRimDiameter != null)
MySqlParameters.Add(new MySqlParameter("p_tire_rim", parameters.TireRimDiameter));
if (parameters.TireLoadIndex != null)
MySqlParameters.Add(new MySqlParameter("p_tire_loa", parameters.TireLoadIndex));
if (parameters.TireSpeedRating != null)
MySqlParameters.Add(new MySqlParameter("p_tire_spd", parameters.TireSpeedRating));
if (parameters.FromYear != null)
MySqlParameters.Add(new MySqlParameter("p_car_fromYear", parameters.FromYear));
if (parameters.ToYear != null)
MySqlParameters.Add(new MySqlParameter("p_car_toYear", parameters.ToYear));
var builder = new StringBuilder();
if (isTireWidth)
{
builder.AppendLine($@"UNION ALL
SELECT 'TireWidth' FilterName, TireWidth FilterValue, COUNT(1) as FilterCount FROM
`products` P LEFT OUTER JOIN `aspnetusers` U ON P.UserId=U.Id
WHERE P.Deleted=0 AND TireWidth IS NOT NULL
AND (P.ExpirationDateUtc='0001-01-01' OR P.ExpirationDateUtc >= @p_date)
AND P.ProductType = @p_product_type");
if (conditionParameters != "") builder.AppendLine($"AND P.ProductCondition IN ({conditionParameters})");
if (brandParameters != "") builder.AppendLine($"AND P.Brand IN ({brandParameters})");
if (sellerParameters != "") builder.AppendLine($"AND U.Type IN ({sellerParameters})");
if (parameters.ToMileage != null) builder.AppendLine($"AND P.Mileage <= @p_mileage");
if (parameters.FromPrice != null) builder.AppendLine($"AND P.PriceCzk >= @p_from_price");
if (parameters.ToPrice != null) builder.AppendLine($"AND P.PriceCzk <= @p_to_price");
if (parameters.TireSeason != null) builder.AppendLine($"AND P.TireSeason = @p_tire_ses");
if (parameters.TireVehicleType != null) builder.AppendLine($"AND P.TireVehicleType = @p_veh_type");
//if (parameters.TireWidth != null) builder.AppendLine($"AND P.TireWidth = @p_tire_wid");
if (parameters.TireHeight != null) builder.AppendLine($"AND P.TireHeight = @p_tire_hei");
if (parameters.TireRimDiameter != null) builder.AppendLine($"AND P.TireRimDiameter = @p_tire_rim");
if (parameters.TireLoadIndex != null) builder.AppendLine($"AND P.TireLoadIndex = @p_tire_loa");
if (parameters.TireSpeedRating != null) builder.AppendLine($"AND P.TireSpeedRating = @p_tire_spd");
builder.AppendLine("GROUP BY TireWidth");
}
if (isTireVehicleType)
{
builder.AppendLine($@"UNION ALL
SELECT 'TireVehicleType' FilterName, TireVehicleType FilterValue, COUNT(1) as FilterCount FROM
`products` P LEFT OUTER JOIN `aspnetusers` U ON P.UserId=U.Id
WHERE P.Deleted=0 AND TireVehicleType IS NOT NULL
AND (P.ExpirationDateUtc='0001-01-01' OR P.ExpirationDateUtc >= @p_date)
AND P.ProductType = @p_product_type");
if (conditionParameters != "") builder.AppendLine($"AND P.ProductCondition IN ({conditionParameters})");
if (brandParameters != "") builder.AppendLine($"AND P.Brand IN ({brandParameters})");
if (sellerParameters != "") builder.AppendLine($"AND U.Type IN ({sellerParameters})");
if (parameters.ToMileage != null) builder.AppendLine($"AND P.Mileage <= @p_mileage");
if (parameters.FromPrice != null) builder.AppendLine($"AND P.PriceCzk >= @p_from_price");
if (parameters.ToPrice != null) builder.AppendLine($"AND P.PriceCzk <= @p_to_price");
if (parameters.TireSeason != null) builder.AppendLine($"AND P.TireSeason = @p_tire_ses");
//if (parameters.TireVehicleType != null) builder.AppendLine($"AND P.TireVehicleType = @p_veh_type");
if (parameters.TireWidth != null) builder.AppendLine($"AND P.TireWidth = @p_tire_wid");
if (parameters.TireHeight != null) builder.AppendLine($"AND P.TireHeight = @p_tire_hei");
if (parameters.TireRimDiameter != null) builder.AppendLine($"AND P.TireRimDiameter = @p_tire_rim");
if (parameters.TireLoadIndex != null) builder.AppendLine($"AND P.TireLoadIndex = @p_tire_loa");
if (parameters.TireSpeedRating != null) builder.AppendLine($"AND P.TireSpeedRating = @p_tire_spd");
builder.AppendLine("GROUP BY TireVehicleType");
}
var result = _context.FilterQueries.FromSqlRaw(builder.ToString(), MySqlParameters.ToArray());
return result;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.