有没有办法在 linq-to-entities 中进行左外连接,而无需使用外键映射表?
此外,如果我们公司决定坚持使用 linq-to-entities,尽管它目前存在所有缺陷,您认为获得 Visual Studio 2010 重要吗?换句话说,Visual Studio 2010 中有什么可以帮助使用 Visual Studio 2008 中没有的实体进行开发?
谢谢。
有没有办法在 linq-to-entities 中进行左外连接,而无需使用外键映射表?
此外,如果我们公司决定坚持使用 linq-to-entities,尽管它目前存在所有缺陷,您认为获得 Visual Studio 2010 重要吗?换句话说,Visual Studio 2010 中有什么可以帮助使用 Visual Studio 2008 中没有的实体进行开发?
谢谢。
这可能无法满足您的要求,因为对象未正确展平,但您可以执行外连接并返回匿名类型的集合。
左外连接与内连接和除外集(第一个集合中不连接到第二个集合的部分)的并集相同。
这里我简单
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}
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}
);