加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Linq查询给出不合适的输出

发布时间:2020-12-15 18:24:48 所属栏目:百科 来源:网络整理
导读:我有两个名为ParentTransaction和ChildTransaction的事务表,其中ParentTransaction的TransactionId将作为TransactionId的ChildTransaction的外部事务. 现在我想得到所有那些未完成payamount的ParentTransaction的TransactionId. 从下面的输出我想要事务Id 3
我有两个名为ParentTransaction和ChildTransaction的事务表,其中ParentTransaction的TransactionId将作为TransactionId的ChildTransaction的外部事务.

现在我想得到所有那些未完成payamount的ParentTransaction的TransactionId.

从下面的输出我想要事务Id 3的记录,因为只有1000支付了transactionid 3而不是5000.

我有一个这样的表:

Transactionid(p.k)    PayAmount
  1                   1000
  2                   3000
  3                   5000
  4                   6000

ChildTransaction

Id        TransactionId(F.k)   DepositAmount
1           1                  600
2           1                  400
3           2                  1000
4           2                  1000
5           2                  1000
6           3                  2000

这是我的查询:

var data = (from tmp in context.ParentTransaction
            join tmp1 in context.ChildTransaction on tmp.Transactionid equals
            tmp1.Transactionid where tmp.PayAmount !=tmp1.DepositAmount
                    select tmp);

但在这里我得到了交易ID 1和2,尽管他们的交易已经完成了两个部分,即600和400的交易ID 1.

解决方法

查询语言的一般概念是表达所需的结果,而不是如何获得它.

将它应用于您的场景会导致这样的简单查询

var query = context.ParentTransaction
   .Where(t => t.PayAmount != context.ChildTransaction
      .Where(ct => ct.TransactionId == t.TransactionId)
      .Sum(ct => ct.DepositAmount));

如果您使用EF和正确的模型导航属性,它甚至会很简单

var query = context.ParentTransaction
    .Where(t => t.PayAmount != t.ChildTransactions.Sum(ct => ct.DepositAmount));

可以说,与@Vadim Martynov的回答相比,上述内容效率低下.好吧,可能是的,可能不是. Vadim试图强制执行一个特定的执行计划,我可以理解 – 当实际遇到查询性能问题时,我们必须做这些事情.但这并不自然,只有在我们遇到性能问题时才应该是最后的手段.在大多数情况下,查询提供程序和SQL查询优化器将为我们执行(并且正在执行)该工作,因此我们不需要考虑是否需要使用连接与子查询等.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读