Làm cách nào để bạn thực hiện một CROSS JOIN với LINQ to SQL?


Câu trả lời:


151

Phép nối chéo đơn giản là tích Descartes của hai tập hợp. Không có toán tử tham gia rõ ràng cho nó.

var combo = from p in people
            từ c trong ô tô
            chọn mới
            {
                p.Name,
                c.Làm,
                c.Model,
                c.Màu sắc
            };

2
Làm thế nào để bạn viết điều đó from p in people from c in carstrong ký hiệu lambda?
— thể thao

48
people.SelectMany(p => cars, (p, c) => new { ... })
— Iain Galloway

38

Điều tương tự với linqcác phương thức mở rộng:

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

25

Dựa trên câu trả lời của Steve, biểu thức đơn giản nhất sẽ là:

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

11

A Tuplelà một loại tốt cho sản phẩm Descartes:

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

6

Phương pháp mở rộng:

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

Và sử dụng như:

vals1.CrossJoin(vals2)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.