2011-08-30 40 views
2

我试图让我的头绕着这个交叉连接(我以前从未见过的东西),以便我可以转换成LINQ。我不完全相信它试图做:试图将交叉连接transact-sql转换为LINQ

Select various a,b,c,d, and e columns 
From Fee a 
inner Join FeeCategory b on a.CategoryID = b.FeeCategoryID 
inner join FeeCompanyType c on a.FeeID = c.FeeID 
cross join FeeType e 
left outer join FeeTypeLink d on a.FeeID = d.FeeID and e.FeeTypeID = d.FeeTypeID 

var q = (
    from fees in Session.Query<Fee>() 
    join feeCategories in Session.Query<FeeCategory>() on fees.FeeCategory.Id equals feeCategories.Id 
    join feeCompanyType in Session.Query<FeeCompanyType>() on fees.Id equals feeCompanyType.Fee.Id 
**erm.....** 
) 

脑的危机,赞赏任何帮助...

回答

1

对于CROSS JOIN添加另一from

from fees in Session.Query<Fee>() 
//cross join: 
from feetypes in Session.Query<Session.Query<Fee>() 
join ... 
join ... 
// left join: 
join feetypelink in Session.Query<FeeTypeLink>() on 
new {fees.FeeID,feetypes.FeeTypeID} equals new{feetypelink.FeeID,feetypelink.FeeTypeID} 
into gr 
from res in gr.DefaultIfEmpty() ..... 
0

您可以使用此:

from a in ctx.As 
join b in ctx.Bs on a.ID equals b.IdOfA //inner join for entities without relationships 
join c in ctx.Cs on 1 equals 1 //inner join with constant condition 
1

只需在其中添加另一个from,因为从LINQ的角度来看,您并不真正“加入”表格。

from fees in Session.Query<Fee>() 
join feeCategories in Session.Query<FeeCategory>() on fees.FeeCategory.Id equals feeCategories.Id 
join feeCompanyType in Session.Query<FeeCompanyType>() on fees.Id equals feeCompanyType.Fee.Id 
from feeType in Session.Query<FeeType>() 
select ... 
1

原始查询是无稽之谈,并没有真正做一个交叉连接

其实就相当于这个

Select various a,b,c,d, and e columns 
From Fee a 
inner Join FeeCategory b on a.CategoryID = b.FeeCategoryID 
inner join FeeCompanyType c on a.FeeID = c.FeeID 
left join FeeTypeLink d on a.FeeID = d.FeeID 
left join Feetype e ON e.FeeTypeID = d.FeeTypeID 

现在您应该可以轻松将其转换为Linq to SQL。我没有那么多,所以会留下其他人填写细节。你不需要任何幻想。

+0

+1我同意废话的概念和你的回答:) –