2009-05-09 2 views

ответ

3

Дозвуковые 2,2 может сделать подзапросов:

Как полагает Адам, Editted и улучшенный пример использования В, это работает для меня:

SubSonic.Select s = new SubSonic.Select(SSDAL.Customer.CustomerIDColumn, SSDAL.Customer.NameColumn); 
SubSonic.Aggregate a = new SubSonic.Aggregate(SSDAL.Customer.CustomerIDColumn, SubSonic.AggregateFunction.Max); 
SSDAL.CustomerCollection COL = new SSDAL.CustomerCollection(); 
SubSonic.Select sq = new SubSonic.Select("LastCustomerId"); 
sq.Aggregates.Add(a); 
sq.From(Tables.Customer); 
a.Alias = "LastCustomerId"; 
s.From(Tables.Customer); 
s.Where(SSDAL.Customer.CustomerIDColumn).In(sq); 
COL = s.ExecuteAsCollection<SSDAL.CustomerCollection>(); 
; 

Этот код производит следующий SQL:

SELECT [dbo].[Customer].[CustomerID], [dbo].[Customer].[Name] 
FROM [dbo].[Customer] 
WHERE [dbo].[Customer].[CustomerID] IN (SELECT MAX([dbo].[Customer].[CustomerID]) AS 'LastCustomerId' 
FROM [dbo].[Customer]) 
+0

Вы хотите использовать In, а не IsEqualTo хотя –

+0

Привет, Zapatta Спасибо, Я пробовал то же самое .. но он дает ошибку .. IsEqual ожидает единственное значение .., но запрос возвращает коллекцию. И еще одна вещь: статус Select, преобразованный в две разные quries..не как подзапрос, который не ожидает. Спасибо nrk – nRk

+0

Я отредактировал свой первоначальный ответ, чтобы включить образец подзапроса, который работает для меня, и должен работать на вас с некоторыми изменениями в соответствии. Он использует In, а не IsEqualTo, как было предложено Адамом. – Zapatta

-1

Насколько я знаю, поддержка подзапросов в SubSonic не поддерживается. Вам нужно поставить запрос в sproc и использовать сгенерированный метод SPs.SprocName().

EDIT: Я был неправ, см. Другой ответ ниже.

+0

SubSonic 2.1+ может обрабатывать подзапросы –

+0

Поскольку я был опровергнуто ниже, я буду удалять этот ответ, но он должен быть непринятым первым, поскольку вы не может удалить принятый ответ. –

2

Адам может быть на что-то, но он выглядит немного уродливым. Вот пример, который является немного более удобной для чтения, который возвращает IDataReader

new SubSonic.Select(Table1.IdColumn,Table1.NameColumn,Table1.AgeColumn) 
.From(Table1.Schema) 
.Where(Table1.IdColumn).In(new SubSonic.Select(Aggregate.Max(Table1.IdColumn)).From(Table1.Schema)) 
.ExecuteReader();