【问题标题】:How do you perform a CROSS JOIN with LINQ to SQL?如何使用 LINQ to SQL 执行 CROSS JOIN?
【发布时间】:2010-09-08 13:33:18
【问题描述】:

如何使用 LINQ to SQL 执行 CROSS JOIN?

【问题讨论】:

    标签: c# linq linq-to-sql cross-join


    【解决方案1】:

    交叉连接只是两个集合的笛卡尔积。它没有明确的连接运算符。

    var combo = from p in people 来自汽车中的c 选择新的 { p.姓名, c.制作, c.型号, c.颜色 };

    【讨论】:

    • from p in people from c in cars 用 lambda 表示法怎么写?
    • people.SelectMany(p => cars, (p, c) => new { ... })
    • 有关 lambda 语法,请参阅stackoverflow.com/a/11395783/4294399
    【解决方案2】:

    与 Linq 扩展方法 SelectMany(lambda 语法)相同:

    var names = new string[] { "Ana", "Raz", "John" };
    var numbers = new int[] { 1, 2, 3 };
    var newList=names.SelectMany(
        x => numbers,
        (y, z) => { return y + z + " test "; });
    foreach (var item in newList)
    {
        Console.WriteLine(item);
    }
    

    【讨论】:

      【解决方案3】:

      根据史蒂夫的回答,最简单的表达方式是:

      var combo = from Person in people
                  from Car    in cars
                  select new {Person, Car};
      

      【讨论】:

        【解决方案4】:

        Tuple 是笛卡尔积的好类型:

        public static IEnumerable<Tuple<T1, T2>> CrossJoin<T1, T2>(IEnumerable<T1> sequence1, IEnumerable<T2> sequence2)
        {
            return sequence1.SelectMany(t1 => sequence2.Select(t2 => Tuple.Create(t1, t2)));
        }
        

        【讨论】:

          【解决方案5】:

          扩展方法:

          public static IEnumerable<Tuple<T1, T2>> CrossJoin<T1, T2>(this IEnumerable<T1> sequence1, IEnumerable<T2> sequence2)
          {
              return sequence1.SelectMany(t1 => sequence2.Select(t2 => Tuple.Create(t1, t2)));
          }
          

          并像这样使用:

          vals1.CrossJoin(vals2)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-05-27
            • 1970-01-01
            • 1970-01-01
            • 2011-01-22
            • 2012-06-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多