【问题标题】:Convert a SQL query to lambda expression将 SQL 查询转换为 lambda 表达式
【发布时间】:2020-10-25 20:20:42
【问题描述】:

SQL 查询:

SELECT
    M.MailItemId, m.Subject,
    ISNULL(m.SendCC, ''),
    ISNULL(attachments.counter, 0) Counters,
    M.CreationDate 
FROM
    MailItem AS M 
LEFT OUTER JOIN
    (SELECT 
         MailItemId, COUNT(MailItemId) counter 
     FROM Attachment Group By MailItemId) AS attachments ON M.MailItemId = attachments.MailItemId

有两种型号MailItemAttachment。想要根据上述条件获取数据。

我想将上述查询转换为 lambda 表达式。

【问题讨论】:

  • Lambda - 不是“lambada” ....
  • 请添加您的实体、您尝试过的代码以及不适合您的代码。

标签: c# sql-server linq lambda entity-framework-core


【解决方案1】:

在不知道你的实体模型是什么样子的情况下,这需要很多假设,主要是存在一个导航属性Attachments,它定义了MailItemAttachment 之间的一对多关系。但是假设它确实存在,您应该能够做一些简单的事情:

_context.MailItems.Select(mi => new {
    MailItemId = mi.MailItemId,
    Subject = mi.Subject,
    Subject = mi.SendCC,
    Counters = mi.Attachments.Count,
    CreationDate  = mi.CreationDate 
});

【讨论】:

  • @stickt01 MailItemId 是 MailItem 表中的主键,也是 Attachment 表中的外键。
  • 当然@Kida - 所以通常您的MaiItem 模型将具有public virtual IEnumerable<Attachment> Attachments 之类的属性,而Attachment 将具有public virtual MailItem MailItem 的属性。然后通常使用映射文件中的这些导航属性来定义外键关系。虽然这假设代码优先......因为在没有看到你的模型的情况下,几乎不可能构造一个表达式。
  • @stickt01- 否。MailItem 和 Attachment 是两个不同的模型。两者都具有 MailItemId 属性。
  • 是的,我知道@Kida 但导航属性可以使生成您想要的查询变得更加容易。见the docs
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多