2009-08-07 20 views
1

外部キーでマッピングされたテーブルを持たずに、linq-to-entitiesで左外部結合を行う方法はありますか?Linq-To-Entitiesに左外部結合

また、現行の欠陥があるにもかかわらずlinq-to-entitiesを使用することに固執すると、Visual Studio 2010を入手することが重要だと思いますか?言い換えれば、Visual Studio 2008に含まれていないエンティティでの開発に役立つVisual Studio 2010の内容は何ですか?

ありがとうございました。

答えて

-1

マイクロソフトでは、LINQ-to-SQLとADO.NETの両方の同じ目標を目指す2つのデータチームがあります。 ADO.NET for Entitiesでは、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} 
    ); 
+1

LINQのツーエンティティDefaultIfEmptyをサポートしていません。 したがって、Visual Studio 2008では.NET 4を使用できません。 – Alex

+0

http://stackoverflow.com/questions/998090/can-i-use-net-4-0-beta-in-visual-studio-2008 –

+1

Entity FrameworkはDefaultIfEmpty()をサポートしていないため、このコードは機能しません。 -1 – Lucas

1

オブジェクトが適切に平坦化されていないので、これはあなたを満たさないことがありますが、外部結合と匿名型のコレクションを返す実行することができます。

左外部結合は、内部結合と例外セット(第2セットに結合しない第1セットの部分)の和集合と同じです。

ここI単に

  • は、内側が
  • は、2つのセットを組み合わせる以外セット(タイプが一致している保証するために、空の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}

関連する問題