我有几个查询,其中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((
开头是好事还是坏事?
答案 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 }
希望它有所帮助。