Оставлено внешнее соединение в Linq-To-Entities - PullRequest
1 голос
/ 07 августа 2009

Есть ли способ сделать левое внешнее объединение в linq-to-entity БЕЗ таблиц с внешними ключами?

Кроме того, если наша компания решит использовать linq-to-entity, несмотря на все ее нынешние недостатки, считаете ли вы важным получение Visual Studio 2010? Другими словами, что в Visual Studio 2010 могло бы помочь разработке с объектами, которых нет в Visual Studio 2008?

Спасибо.

Ответы [ 2 ]

1 голос
/ 26 октября 2009

Это может вас не устраивать, поскольку объекты не выровнены должным образом, но вы можете выполнить внешнее соединение и вернуть коллекцию анонимных типов.

Левое внешнее объединение такое же, как объединение внутреннего объединения и набора исключений (часть первого набора, которая не соединяется со вторым набором).

Здесь я просто

  • рассчитать внутреннее соединение
  • вычислить набор исключений (создание пустой сущности B для обеспечения согласованности типов)
  • объединить два комплекта.

LINQ не красивый, но милый.

class A
{
    public int Id { get; set; }
    public string PropertyA { get; set; }        
}

class B
{
    public int Id { get; set; }
    public string PropertyB { get; set; }
}   

var aThings = new List<A>();
var bThings = new List<B>();

var innerJoin = aThings.SelectMany(a => 
    bThings.Where(b => a.Id == b.Id).Select(b => new { a, b })).ToList();

var exceptSet = aThings.Where(a => 
    !bThings.Select(b => b.Id).Contains(a.Id)).Select( a =>
    {
        B b = new B();
        return new { a, b };
     });

var outerJoin = innerJoin;
outerJoin.AddRange(exceptSet);

В результате получается список анонимных типов {a, b}

0 голосов
/ 07 августа 2009

Microsoft имеет две группы данных, которые обе стремятся к одной и той же цели: LINQ-to-SQL и объект ADO.NET. Теперь существует поддержка ADO.NET для сущностей, что означает, что LINQ-to-SQL не будет таким приоритетным, как предложение ADO.NET.

Visual Studio 2010 поддерживает .NET 4, которая, в свою очередь, поддерживает ADO.NET для сущностей и LINQ-to-SQL. Помимо числа функций повышения производительности, представленных в VS2010, я мало что видел с точки зрения поддержки данных, которая отличается от VS2008.

В терминах левого внешнего соединения:

var dc = new DataContext();

var query = (
    from t1 in dc.MyTable
    join a in MyJoinedTable on p.Id equals a.Id into tempTable
    from t2 in tempTable.DefaultIfEmpty()
    select new { p.Column1, p.Column2, t2.Column1}
    );
...