Попытка преобразовать кросс-соединение Transact-SQL в LINQ - PullRequest
2 голосов
/ 30 августа 2011

Я пытаюсь разобраться в этом перекрестном соединении (то, чего я никогда раньше не видел), чтобы преобразовать его в 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.....**
)

Мозг в распаде, любая помощь приветствуется ...

Ответы [ 4 ]

1 голос
/ 30 августа 2011

Исходный запрос бессмыслен и фактически не выполняет перекрестное соединение

Фактически это эквивалентно этому

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 для SQL,Я не использую так много, поэтому оставлю других, чтобы заполнить детали.Тебе не нужно ничего особенного.

1 голос
/ 30 августа 2011

Просто добавьте туда еще один 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 голос
/ 30 августа 2011

Для перекрестного соединения просто добавьте еще 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 голосов
/ 30 августа 2011

Вы можете использовать это:

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
...