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

137

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

5个回答

177

交叉连接(cross-join)就是两个集合的笛卡尔积。它没有专门的连接操作符。

var combo = from p in people
            from c in cars
            select new
            {
                p.Name, // 名称
                c.Make, // 厂商
                c.Model, // 型号
                c.Colour // 颜色
            };

2
你如何使用Lambda符号来编写from p in people from c in cars这段代码? - sports
63
people.SelectMany(p => cars, (p, c) => new { ... })翻译:对于每个人和每个车,创建一个新对象。您可以使用此代码来连接列表中的两个元素。 - Iain Galloway
有关lambda语法,请参见https://dev59.com/znVD5IYBdhLWcg3wL4mM#11395783。 - General Grievance

43

使用 Lambda 语法的 Linq 扩展方法 SelectMany 也是同样的道理:

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);
}

27

根据Steve的回答,最简单的表达式应该是这样的:

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

13

Tuple是Cartesian积的好类型:

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)));
}

它的参数和返回类型是 IEnumerable 而不是 IQueryable,它适用于 Linq 而不是 Linq to SQL。 - Mr. Squirrel.Downy

8

扩展方法:

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)

它的参数和返回类型是 IEnumerable 而不是 IQueryable,它适用于 Linq 而不是 Linq to SQL。 - Mr. Squirrel.Downy

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