外部キーでマップされたテーブルを持たずに、linq-to-entitiesで左外部結合を行う方法はありますか?
また、当社が使用を続けることに決めた場合現在のすべての欠陥にもかかわらず、linq-to-entitiesは、Visual Studio 2010を取得することが重要だと思いますか?つまり、Visual Studio 2010には、Visual Studio 2008にないエンティティの開発に役立つものは何ですか?
ありがとう。
回答:
回答№1は1オブジェクトが適切にフラット化されていないため、これでは満足できないかもしれませんが、外部結合を実行して匿名型のコレクションを返すことができます。
左外部結合は、内部結合と例外セット(2番目のセットに結合しない最初のセットの部分)の和集合と同じです。
ここで私は単に
- 内部結合を計算する
- 除外セットを計算します(型の一貫性を確保するために空のBエンティティを作成します)
- 2つのセットを結合します。
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}です
回答№2の場合は-1
Microsoftには2つのデータチームがあり、どちらも目指しています同じ目標:LINQ-to-SQLおよびADO.NETエンティティ。現在、ADO.NET for Entitiesがサポートされています。つまり、LINQ-to-SQLはADO.NETオファリングほど優先順位が高くありません。
Visual Studio 2010はをサポートしています。NET 4は、エンティティおよびLINQ-to-SQLのADO.NETをサポートします。 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}
);