左外加入Linq-To-Entities

时间:2009-08-07 17:31:05

标签: entity-framework linq-to-entities left-join

有没有办法在linq-to-entities中进行左外连接而不用使用外键映射表?

此外,如果我们公司决定坚持使用linq-to-entity尽管目前存在各种缺陷,您认为获得Visual Studio 2010很重要吗?换句话说,Visual Studio 2010中有哪些内容可以帮助开发不在Visual Studio 2008中的实体?

感谢。

2 个答案:

答案 0 :(得分:1)

这可能不满足您,因为对象没有正确展平,但您可以执行外部联接并返回匿名类型的集合。

左外连接与内连接和外集(第一组中未连接到第二组的部分)的并集相同。

我只是

  • 计算内部联接
  • 计算除集合(创建空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}

答案 1 :(得分:-1)

Microsoft有两个数据团队,他们都朝着相同的目标:LINQ-to-SQL和ADO.NET实体。现在支持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}
    );