【问题标题】:Linq join values from two lists来自两个列表的 Linq 连接值
【发布时间】:2014-04-14 08:45:52
【问题描述】:

我需要从不同的列表中提取两个值。我有一个 Order 对象列表和一个 Visitor 对象列表,每个对象都包含按日期列出的完整对象列表。

我需要访问来自访客列表的访客属性和来自订单列表的 TotalOrders 属性。然后我需要将每个 TotalOrders 与访客分开以获得第三个值(转化率)。最后,我想将每个 conversionRate 值添加到 List TotalConversions。

我正在尝试编写一个 Linq 查询,该查询从各自的访问者和 TotalOrders 中获取,但我不确定如何执行此操作。

 List<GAVisitorsModel> VisitorsList = GetGAStatisticsReport(model);
        List<GC_OrdersModel> OrdersList = GetOrderReport(model);
        List<GC_ConversionRateModel> TotalConversions = new List<GC_ConversionRateModel>();
        foreach (var order in OrdersList)
        {
            string _date = order.Date;

            var Conversions = VisitorsList.Join(OrdersList, x => x.Visitors, y => y.TotalOrders, (x, y) => new { X = x, Y = y });


            foreach (var c in Conversions)
            {

                //-- Y / X = C

                //int _conversion = C;

                //-- GC_ConversionRateModel GC_Orders = new GC_ConversionRateModel(_date, _conversion)
            }
        }    

        return TotalConversions;

List TotalConversions 应按日期返回转化列表。

这些是对象类:

GAVisitorsModel:

public class GAVisitorsModel : IGAVisitorsModel
    {

        public string Date { get; set; }
        public int Visitors { get; set; }

        public GAVisitorsModel(string _date, string _visitors)
        {

            Date = _date;
            Visitors = _visitors;

        }

    }

GCOrdersModel:

 public class GC_OrdersModel
    {

        public string Date { get; set; }
        public int TotalOrders { get; set; }
        public int TotalProducts {get; set;}



        public GC_OrdersModel(string _date, int _totalOrders, int _totalProducts)
        {
            Date = _date;
            TotalOrders = _totalOrders;
            TotalProducts = _totalProducts;
        }

    }

GC_ConversionRateModel:

public class GC_ConversionRateModel
{

    public string Date { get; set; }
    public int ConversionRate { get; set; }



    public GC_ConversionRateModel(string _date, int _conversionRate)
    {
        Date = _date;
        ConversionRate = _conversionRate;
    }

}

【问题讨论】:

  • 您想通过什么键加入?
  • 我认为您需要为您的每个对象提供类结构,以便我们为您提供帮助。
  • @Anatolii Gabuza 关键是“OrdersList Date”,值是访客/总订单。我正在使用 Google Charts API 我需要 X 和 Y 轴的 Date 和 ConversionValue。

标签: c# .net asp.net-mvc linq


【解决方案1】:

看看以下是否适合你

public List<GC_ConversionRateModel> GetConversionRate()
    {

        List<GAVisitorsModel> VisitorsList = GetGAStatisticsReport(model);
        List<GC_OrdersModel> OrdersList = GetOrderReport(model);
        List<GC_ConversionRateModel> TotalConversions = new List<GC_ConversionRateModel>();

        OrdersList.ForEach(o => {
            TotalConversions.Add((from v in VisitorsList
                                 where v.Date == o.Date
                                 select new GC_ConversionRateModel(o.Date, o.TotalOrders / v.Visitors)).FirstOrDefault());

        });

        return TotalConversions;
    }

此外,在您的GAVisitorsModel 中,当您尝试在ctor 中将字符串分配给Visitors = _visitors; 中的整数时似乎出现错误。

【讨论】:

  • 这种语法确实看起来流畅且令人印象深刻。将对此进行更多研究。它编译并运行,但 ConversionRate 为 0,但我确实得到了 Date。关于字符串到 int iv'e 现在将所有值转换为正确的数据类型。访客 int 和 TotalOrders int。它应该可以工作,因为它只是 int/int 但其他东西必须是问题。将对此进行进一步调查。谢谢!
【解决方案2】:

我建议使用:

var result = from visitor in VisitorsList
             join order in OrdersList on visitor.Date equals order.Date into orders
             select new {
                 Visitor = visitor,
                 VisitorOrders = orders
             };

假设您有一些属性“连接” 访问者和订单(Date 值),您将拥有相应订单的访问者列表。

【讨论】:

  • 好的,我明白了。好吧,我没有访客的 ID 属性。我制作了一个 Google Analytics API 客户端,可以获取按日期过滤的访问者数量。我只创建了 Date 和 visitor 属性来表示我从 API 获得的相应值。但是 GCOrdersModel 和 GAVisitorsModel 都包含一个 Date 属性,我可以用它作为 ID 吗?最终结果将是按日期的 ConversionRate,因此它们都有共同的日期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
相关资源
最近更新 更多