如何将两个序列合并成一个?

5

我有一些可以从数据库检索数据的可工作代码。我希望获得更好的代码来解决我的问题。是否有将两个查询合并为一个或类似的方法?

Dim customerTitlesAndIDs = contex.CustomerTable.Select(Function(row) New
                           With {.ID = row.ID, .CustomerTitle = row.Title}).ToList()

Dim cutomerIdPayment = contex.CustomerPayments.Select(Function(table) New 
                       With
                       {
                           .ID = table.CustomerID,
                           .Range = table.PaymentsRange,
                           .Values = table.Values
                       }).ToList()

Dim customerInfos As New List(Of SCustomerInfo)

For Each customer In customerTitlesAndIDs

    Dim cID As Integer = customer.ID
    customerInfo.Add(New SCustomerInfo(CreateCustomerTable(), cID, customer.CustomerTitle))

    For Each cutomerPayments In cutomerIdPayment

        If cutomerPayments.ID = cID Then
            Dim rangeValue(1) As Object
            rangeValue(0) = cutomerPayments.Range
            rangeValue(1) = cutomerPayments.Values
            Dim dtRow As DataRow = customerInfos.Last().PaymentTable.NewRow()
            dtRow.ItemArray = rangeValue
            customerInfos.Last().PaymentTable.Rows.Add(dtRow)
        End If
    Next
Next

Return customerInfos

同样的代码在C#中(希望没有语法错误):

var customerTitlesAndIDs = contex.CustomerTable.Select(row => new
                           { .ID = row.ID, .CustomerTitle = row.Title }).ToList();

var cutomerIdPayment = contex.CustomerPayments.Select(table => new
                       {
                           .ID = table.CustomerID,
                           .Range = table.PaymentsRange,
                           .Values = table.Values
                       }).ToList();

List<SCustomerInfo> customerInfos = new List<SCustomerInfo>;

foreach (var customer in customerTitlesAndIDs)
{
    int cID = customer.ID;
    customerInfos.Add(new SCustomerInfo(CreateCustomerTable(), cID, customer.CustomerTitle));

    foreach (var cutomerPayments in cutomerIdPayment)
    {
        if (cutomerPayments.ID = cID)
        {
            object[] rangeValue = new object[1] {cutomerPayments.Range, cutomerPayments.Values};
            DataRow dtRow = customerInfos.Last().PaymentTable.NewRow();
            dtRow.ItemArray = rangeValue;

            customerInfos.Last().PaymentTable.Rows.Add(dtRow);
        }
    }
}

以下是用以下结构体表示的客户信息(代码已经简化):

Public Structure SWindAltitude
    Public PaymentTableAs DataTable
    Public Title As String
    Public ID As Integer
End Structure

无论是C#还是VB.NET的解决方案都会很有帮助。


3
也许只是我个人的看法,但如果你希望接受C#的答案,你应该发布C#代码,因为我对VB不是很熟悉。 - Jonesopolis
你觉得将C#和VB.net代码放在同一个问题中会不会很好? - frankie
C#和VBNET可以被视为一个,两者都依赖于.NET Framework,并且这两种语言之间可以轻松地进行翻译。对我来说,如果有人在特定语言的.NET问题中要求C#/VBNET解决方案,那么这是正确的。但是有些人喜欢对这些愚蠢的事情进行投票或删除标签。 - ElektroStudios
使用JOIN contex.CustomerTable.Join(contex.CustomerPayments, ...) - Ahmed KRAIEM
你能展示一些样例代码吗? - frankie
3个回答

2
尝试使用导航属性实现以下内容(由于我不知道您的数据结构的确切组成,因此可能需要进行调整):
类似这样的代码:
var customerQuery = context.CustomerTable.Select( ct => 
    new { 
        ct.ID, 
        ct.CustomerTitle, 
        // use nav property to get customer payments
        CustomerPayments = ct.CustomerPayments.Select( cp => 
            new { 
                Range = cp.Range, 
                Values = cp.Values } ) } );

return customerQuery.ToArray()
    .Select( cq => 
        {
            var retVal = new SCustomerInfo( CreateCustomerTable(), cq.ID, cq.CustomerTitle ); 

            foreach( var customerPayment in cq.CustomerPayments )
            {
                var dtRow = cq.PaymentTable.NewRow();

                dtRow.ItemArray = new object[] { customerPayment.Range, customerPayment.Values };

                retVal.PaymentTable.Rows.Add( dtRow );
            }

            return retVal;
        } );

为什么在调用 Select 之前要使用 ToArray - Grundy
2
枚举来自数据库的结果 - 在LINQ to Entities选择语句中不能有带参数的构造函数。调用ToArray()从数据库获取结果,现在我们正在使用IEnumerable<T>.Select(...)。如果没有.ToArray(),我们仍将使用L2E IQueryable<T> - Moho
根据它们的确切功能,SCustomerInfo的构造函数和CreateCustomerTable()函数可能可以进行重构以适用于L2E。 - pseudocoder
我对学习如何实例化一个带有非参数构造函数的客户端对象很感兴趣,@pseudocoder。我非常确定这在L2E中是不可能的 - 你会得到一个“只允许无参构造函数”的异常消息。 - Moho
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/41974/discussion-between-pseudocoder-and-moho - pseudocoder
显示剩余6条评论

0

如果我理解正确,在C#中使用LINQ应该是这样的

var customerInfos = customerTitlesAndIDs.Select((c)=>{
                        var ci = new SCustomerInfo(CreateCustomerTable(), c.ID, customer.CustomerTitle);
                        ci.PaymentTable = ci.PaymentTable.AsEnumerable().Union(
                                          cutomerIdPayment.Where(j=>j.ID == c.ID)
                                                          .Select(j=>{
                                                              var dtRow = ci.PaymentTable.NewRow();
                                                              dtRow.ItemArray = new object[] {
                                                                  customerPayment.Range,
                                                                  customerPayment.Values 
                                                              };
                                                              return dtRow;
                                          })).CopyToDataTable();
                        return ci;
                    }).ToList();

我怀疑new SCustomerInfo(x,x,x)在此处作为LINQ到实体查询内部的调用方式是否可行,请参考@Moho的答案。 - pseudocoder

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接