【问题标题】:Converting SQL query result to Linq result with an new field that is not in the Model使用不在模型中的新字段将 SQL 查询结果转换为 Linq 结果
【发布时间】:2021-09-11 07:40:04
【问题描述】:

我有一个 SQL 查询,

SELECT 
    c.AssignedTo ,c.CampaignID, c.Name, c.Venue,c.StartedOn, 
    c.CompletedOn, c.IsOpen, COUNT(C.Name) AS Leads 
FROM 
    Campaign AS c 
RIGHT JOIN 
    Leads AS l ON l.CampaignID = c.CampaignID 
GROUP BY
    c.AssignedTo, c.CampaignID, c.Name,c.Venue,c.StartedOn, c.CompletedOn, c.IsOpen 
ORDER BY 
    c.AssignedTo  

这是我在该查询中的两个表,CAMPAIGNS

[Table("Campaigns")]
public class Campaigns
{
    [Key]
    public int CampaignID { get; set; }

    [MaxLength(30)]
    public string Name { get; set; }
        
    [MaxLength(200)]
    public string Venue { get; set; }

    [ForeignKey("UsersReference")]
    public int AssignedTo { get; set; }

    public DateTime StartedOn { get; set; }
    public DateTime? CompletedOn { get; set; }
    public bool IsOpen { get; set; }

    // To Reference Users table using FK
    public Users UsersReference { get; set; }
}

Leads:

[Table("Leads")]
public class Leads
{
    [Key]
    public int LeadID { get; set; }
        
    [ForeignKey("CampaignsReference")]
    public int CampaignID { get; set; }

    [MaxLength(30)]
    public string ConsumerName { get; set; }

    [MaxLength(30)]
    public string EmailAddress { get; set; }

    [MaxLength(10)]
    public string PhoneNo { get; set; }

    public string PreferredMoC { get; set; }
    public DateTime DateApproached { get; set; }

    [ForeignKey("ProductsReference")]
    public int ProductID { get; set; }

    public string Status { get; set; }

    // To access Campaign and Product table through FK
    public Campaigns CampaignsReference { get; set; }
    public Products ProductsReference { get; set; }
}

我的查询在 SQL 中返回如下结果:

Leads 列只是与我的CampaignID 匹配的列中的COUNT()。我使用了context.Campaigns.FromSqlRaw(),但由于我的Campaigns 没有专门用于计数的另一列。

有没有办法使用 EF Core 和 Linq 显示我的新字段 Count()

【问题讨论】:

  • 帮自己一个忙并遵守命名约定:类的单数名称(如果有的话,集合的复数名称)。并且没有像Reference这样的后缀:即public Campaign Campaign { get; set; }

标签: sql linq asp.net-core entity-framework-core


【解决方案1】:

对此类任务使用 LINQ 查询。

var query =
    from l in ctx.Leads
    let c = l.CampaignsReference
    group c by new { c.AssignedTo, c.CampaignID, c.Name, c.Venue, c.StartedOn, c.CompletedOn, c.IsOpen } into g
    select new 
    {
        g.Key.AssignedTo,
        g.Key.CampaignID, 
        g.Key.Name, 
        g.Key.Venue,
        g.Key.StartedOn, 
        g.Key.CompletedOn, 
        g.Key.IsOpen,
        Leads = g.Sum(x => x.Name != null ? 1 : 0)
    };

var query = query.OrderBy(x => x.AssignedTo);

【讨论】:

    猜你喜欢
    • 2010-10-31
    • 2012-07-05
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多