linq, чтобы побудить левого внешнего соединения - PullRequest
4 голосов
/ 01 февраля 2010

Я изо всех сил стараюсь, чтобы сущности оставили внешнее соединение. У меня есть две сущности (таблицы):

Listings 
{
    ListingID,
    MakeID (nullable)
}

Makes
{
    MakeID,
    Description
}

Я хочу написать что-то подобное в LINQ:

select listings.listingID
,listings.makeid
, IsNull(makes.Description, 'NA')
from listings
left outer join makes
on listings.makeid = makes.makeid

Ответы [ 4 ]

5 голосов
/ 01 февраля 2010

Ниже ваше решение для достижения левого соединения. Что касается других ресурсов, я действительно рекомендую попробовать linq pad: http://www.linqpad.net/ Это отличный инструмент обучения для Linq.

// Listing class/container/table
public class Listing
{
    public string ListingID {get;set;}
    public Int32? MakeID {get;set;}
}

// Make class/container/table
public class Make
{
    public Int32 MakeID {get;set;}
    public string Description {get;set;}
}

public class Main
{
    public static void LinqMain()
    {
        // Populate the listing table with data
        List<Listing> listings = new List<Listing>()
        {
            new Listing() { ListingID = "Test 1", MakeID = 1 },
            new Listing() { ListingID = "Test 2", MakeID = 1 },
            new Listing() { ListingID = "No Make", MakeID = null },
            new Listing() { ListingID = "Test 3", MakeID = 3 },
            new Listing() { ListingID = "Another Makeless", MakeID = null }
        };

        // Populate the makes table with data
        List<Make> makes = new List<Make>()
        {
            new Make() { MakeID = 1, Description = "Make 1"},
            new Make() { MakeID = 2, Description = "Make 2"},
            new Make() { MakeID = 3, Description = "Make 3"},
            new Make() { MakeID = 4, Description = "Make 4"}
        };

        // Return the left join on Make Id
        var result = from l in listings

                     // These two lines are the left join. 
                     join leftm in makes on l.MakeID equals leftm.MakeID into leftm
                     from m in leftm.DefaultIfEmpty()

                     // To ensure the select does not get bogged down with too much logic use the let syntax
                     let description = m == null ? "NA" : m.Description

                     select new { l.ListingID, l.MakeID, description };


    }

Переменная результата будет содержать:

  1. {ListingID = "Test 1", MakeID = 1, description = "Make 1"}
  2. {ListingID = "Test 2", MakeID = 1, description = "Make 1"}
  3. {ListingID = "No Make", MakeID = null, description = "NA"}
  4. {ListingID = "Test 3", MakeID = 3, description = "Make 3"}
  5. {ListingID = "Another Makeless", MakeID = null, description = "NA"}
2 голосов
/ 20 апреля 2010

Любой, кто говорит вам использовать .DefaultIfEmpty () как часть внешнего объединения в LINQ to Entities, на самом деле не пробовал сам! Tt просто не работает - по крайней мере, как у .NET 3.5 SP1.

Этот блоггер говорит вам, как вы должны это сделать. По сути, .NET выполняет внешнее соединение в LINQ to Entities по умолчанию , поэтому вы должны пропустить .DefaultIfEmpty (). Для нескольких внешних объединений необходимо вложить группы запросов, чтобы их контекст был понятным.

0 голосов
/ 04 февраля 2010

Не перед машиной разработчика, чтобы проверить, но что-то вроде этого?

var x = from l in listings
    join m in makes on l.makeid equals m.makeid into g
    from ma in g.DefaultIfEmpty()
    select new 
    {
        l.listingID, 
        l.makeid, 
        (ma.Description == null ? "NA" : ma.Description)
    };

Если у вас возникли какие-либо проблемы, дайте мне знать, и я проверю свой рабочий компьютер.

0 голосов
/ 01 февраля 2010

http://oddiandeveloper.blogspot.com/2008/12/testable-left-outer-join-in-linq-to.html

Это должно помочь, это сообщение в блоге, которое я сделал некоторое время назад, должно быть актуальным и также может помочь с проверяемостью.

Также убедитесь, что ваши внешние ключи на месте при создании вашей модели сущности, это поможет настроить ваши зависимости.

...