【问题标题】:How to write a Linq query equivalent to this SQL如何编写与此 SQL 等效的 Linq 查询
【发布时间】:2013-05-19 05:05:12
【问题描述】:

我正在尝试弄清楚如何编写一个 linq 查询,它将向下面的 sql 查询返回等效的结果。我遇到的问题与主查询的选择列表中包含的两个选择计数查询有关。我需要从PaymentHistory 表中计算去年的两种不同类型的记录。可以使用 linq 编写等效的内容吗?最好使用 lambda 语法。

select ieinum, serviceaddrkey,
  (select count(*) from PaymentHistory where serviceaddrid = serviceaddrkey
   and PostDate >= DateAdd(year, -1 , GetDate())
   and SetID = 100) as ReturnedFees,
(select count(*) from PaymentHistory where serviceaddrid = serviceaddrkey
   and PostDate >= DateAdd(year, -1 , GetDate())
   and SetID = 101) as CorrectedReturnedFees
from Serviceaddr 

任何帮助都会很棒。

【问题讨论】:

    标签: linq-to-sql sql-to-linq-conversion


    【解决方案1】:

    大概是这样的:

    from s in Serviceaddr
    let ph = PaymentHistory.Where(p => s.serviceaddrkey == p.serviceaddrkey &&
                                       p.PostDate >= DateTime.Now.AddYears(-1))
    select new
    {
      s.ieinum,
      s.serviceaddrkey,
      ReturnedFees = ph.Count(p => p.SetID == 100),
      CorrectedReturnedFees = ph.Count(p => p.SetID == 101)
    }
    

    【讨论】:

    • 感谢马格努斯的帮助。我最终做了一些不同的事情。我在原始帖子中提供的 SQL 语句,如果我可以让它在 Linq 中工作,那么我将使用第二个 linq 查询从第一个 linq 查询的结果中选择记录,以获得我真正需要的数据。我从一位同事那里找到了一种方法,可以在一个 linq 查询中获取所有结果,并希望分享它以防您感兴趣。这里是:
    • var backdate = DateTime.Today.AddYears(-1); var query = from sa in DataContext.serviceaddrs let Set100 = sa.PaymentHistories.Count(p => p.PostDate >= backdate && p.SetID == 100) let Set101 = sa.PaymentHistories.Count(p => p.PostDate >= backdate && p.SetID == 101) 其中 sa.State == "TX" && !sa.Status.Contains("Closed") && !sa.Status.Contains("Closed") && !sa.Status。 Contains("Inactive-WOFF") && !sa.Status.Contains("Cancel") && !sa.Status.Contains("Bucket") && ((Set100 - Set101)
    猜你喜欢
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    相关资源
    最近更新 更多