2

我有几个查询,其中有 2 个 from 子句,如下所示:

var TheResult = from a in MyDC.Table1
                from b in MyDC.Table2
                where a.SomeCol == b.SomeOtherCol
                select new MyModel() {....}

我担心这种语法会创建笛卡尔连接,我想join用只有一个from子句的语法重写它。我的问题是:我应该如何确定应该在from子句中放入哪个表?

谢谢。

编辑:查询生成的 t-sql 开头SELECT COALESCE((是好还是坏?

4

2 回答 2

0

您可以很容易地将其重写为 JOIN:

var result = from a in MyDC.Table1
             join b in MyDC.Table2 on a.SomeCol equals b.SomeOtherCol
             select new MyModel() { SomeProp = a.SomeCol, SomeProp2 = b.SomeCol }

或者,如果您想要左连接:

var result = from a in MyDC.Table1
             join b in MyDC.Table2 on a.SomeCol equals b.SomeOtherCol
             into myGroup
             from m in myGroup.DefaultIfEmpty()
             select new MyModel() { SomeProp = a.SomeCol, SomeProp2 = m.SomeCol }
于 2012-09-28T00:37:16.687 回答
0

您提供的模型过多地面向数据,并且没有很好的面向对象的感觉来理解如何解决问题。

考虑对象,你所拥有的一个例子是:

var TheResult = from u in context.Users
            from c in MyDC.Countries
            where u.CountryId == c.Id
            select new MyModel() { UserName = u.Name, CountryName = c.Name }

有了类似的东西,你可以添加(你应该!)用户(映射到表 1)和国家(映射到表 2)之间的关系,所以你可以这样做:

var country = user.Country;

这将使您进行更直接的查询,完全由 Linq-to-sql 支持(并且完全鼓励!):

var TheResult = from u in context.Users
                select new MyModel() { UserName = u.Name, CountryName = u.Country.Name }  

希望能帮助到你。

于 2012-09-28T04:50:00.397 回答