【问题标题】:linq query for returning single row用于返回单行的 linq 查询
【发布时间】:2015-03-30 10:11:59
【问题描述】:

对于发生的任何事务,都会在我的表中插入一行。

我有如下表(交易)

ID----------金额

1------------150.00

2----------- 246.00

3----------- 100.00

4----------- 201.00

如果上述交易发生在多种支付类型(现金、信用卡等)中,则对于每种支付类型,都会在另一个表中插入一行。

这个新表(Tender)如下所示

ID---- TenderType----- TransactionId

1----------- 10 ---- 1

2------------ 20---- 2

3-------------10-----2

以上说明,第一个交易(来自 Transactions 表,金额 150.00)只发生了一种投标类型(10)。所以投标表中只有一行。

第二笔交易(金额 246.00)发生在两种投标类型(10 和 20)中。所以投标表中有两行。

现在我想要输出为

金额-----TenderType

150.00 ------ 10

246.66-------10/20

现在我正在用 c# 编写一个 linq 查询,如果 Tender 表中有多行对应于 Transaction 表中的每个 Amount,它将返回两行。

我的查询如下所示:

(from T in context.Transactions
join TT in context.TenderType on T.ID equals TT.TransactionId
select new myModel
{
    Amount = T.Amount,
    TenderType = TT.TenderType
}).ToList();

对于这个查询,我的输出如下所示:

金额-----TenderType

150.00 ------ 10

246.66-------10

246.66-------20

但我的输出应该是这样的:

金额-----TenderType

150.00 ------ 10

246.66-------10/20

如何修改我的查询来实现这一点?

提前致谢。

【问题讨论】:

  • 你有机会看看我的答案吗?

标签: c# linq linq-to-entities


【解决方案1】:

听起来你可以有一个从交易到投标的one to many 关联。

public class Transaction {
  public int ID { get; set; }
  public double Amount { get; set; }
  public virtual ICollection<Tender> Tenders { get; set; }
}

from T in context.Transactions
select new {
  Amount = T.Amount,
  TenderTypes = T.Tenders.Select(t => t.TenderType)
}

【讨论】:

  • 分配给 TenderTypes ?
  • 我不明白你的问题。
  • 以上查询中的“TenderTypes”是什么
  • TenderTypes 是一个 IEnumerable。所以返回的每一行都是一个double Amount,IEnumberable TenderTypes。 (假设 Tender.TenderType 是您建议的字符串)
【解决方案2】:

试试这个

 (from T in context.Transactions
  select new myModel
 {
    Amount = T.Amount,
    TenderType = context.TenderType.Where(x=>x.TransactionId==T.ID).Select(x=>x.TenderType).FirstOrDefault()
 }).ToList();

【讨论】:

  • 这里我的 TenderType 是字符串,不能将我的数据库模型的类型隐式转换为字符串
  • 因为它有 FirstOrDefault(),它返回 Tender 表中的第一个值,并且在每个事务的 Tender 表中有 2 行的情况下只给出一个值
【解决方案3】:

试试这个:-

var result= (from T in context.Transactions
             join TT in context.TenderType
             on T.ID equals TT.TranscationID into g
             select new 
             {
                Amount = t.Amount,
                TenderType = String.Join("/",g.Select(x => x.TenderTypeID))
             }).Where(x => !String.IsNullOrEmpty(x.TenderType));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多