使用2从子句到连接重写linq-to-sql查询

时间:2012-09-28 00:23:51

标签: c# linq linq-to-sql

我有几个查询,其中2个子句看起来像这样:

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((开头是好事还是坏事?

2 个答案:

答案 0 :(得分: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 }

答案 1 :(得分: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 }

有了这样的东西,你可以添加(你应该!)User(映射到Table1)和Country(映射到Table2)之间的关系,所以你可以这样做:

var country = user.Country;

这将让你做一个更直接的查询,完全由Linq-to-sql支持(并且完全被enocouraged!):

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

希望它有所帮助。