【问题标题】:SQL Query To Linq or Lambda ExpressionSQL 查询到 Linq 或 Lambda 表达式
【发布时间】:2013-03-26 22:45:34
【问题描述】:

我只是想为以下 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'

感谢任何帮助。

【问题讨论】:

  • 我试过 var p = db.Account_Transaction.join(db.Accounts,o=>o.AccountId,p=>p.ID,(o,p)=>new{o,p} ).where(o=>o.o.Date >= '2013-01-01' && o.o.Date new{grp.o.debit,grp.o.credit} ).select(result=>new {result.sum(o=>o.o.credit-o=>o.o.debit)});但我遇到了一个错误,比如无效的匿名声明符等。

标签: .net sql linq lambda


【解决方案1】:

这应该可行:

            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);

【讨论】:

  • 感谢您的帮助,但我试过了,似乎根本没有给我任何结果。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多