SQL查询到Linq或Lambda表达式

时间:2013-03-26 22:45:34

标签: .net sql linq lambda

我只是想知道为以下sql查询语句创建等效的linq或lambda表达式:

select(sum(a.credit) - sum(a.debit)) as total 
from table_A a inner join table_B b on 
a.accountid = b.id 
where a.[date] >= '2013-01-01' 
and a.[date] < '2013-03-27' 
and b.Name = 'MKBank'

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

这应该有效:

            var qr = from a in lA
                 join b in lB on a.Id equals b.Id
                 where a.Date >= new DateTime(2013, 1, 1) &&
                 a.Date < new DateTime(2013, 3, 7) &&
                 b.Name == "MKBank"
                 select new
                 {
                     cr = a.credit,
                     db = a.debit
                 };

        var res = qr.Sum((x) => x.cr - x.db);

答案 1 :(得分:0)

您看到的错误是因为您在最终选择中声明了您的匿名类型。如果要指定要从中选择的属性名称以外的任何内容,则需要指定成员名称。阅读Anonymous Types (C# Programming Guide)了解更多详情。

您的查询还有其他一些问题。您也无法比较DateTimestring值,因此您应该在将日期参数传递给查询之前构建它们。如果您只想要一个帐户的总计,则不需要执行任何.GroupBy.Select。最后o => o.o.credit - o => o.o.debit将无法编译。我想你想要的是o => o.o.credit - o.o.debit

请改为尝试:

DateTime beginDate = ...
DateTime endDate = ...
p = db.Account_Transaction.Join(
        db.Accounts,
        o => o.AccountId, 
        p => p.ID,
        (o, p) => new { o, p })
    .‌Where(o => o.o.Date >= beginDate && o.o.Date < endDate && o.p.Name == "MKBank")
    .Sum(o => o.o.credit - o.o.debit);