2011-12-14 9 views
1

У меня есть много подобных звонков в базу данных, и они прекрасно работаютРасширение Выбор методов Entity Framework

Using ta As New QT_SSTEntities 
Return ta.Product. 
    Select(Function(c) New RadComboBoxData() With {.Text = c.FieldName1, .Value = c.FieldName1}). 
    ToArray() 
End Using 

Using ta As New QT_SSTEntities 
Return ta.City. 
    Select(Function(c) New RadComboBoxData() With {.Text = c.CityName, .Value = c.CityName}). 
    ToArray() 
End Using 

Using ta As New QT_SSTEntities 
Return ta.OtherProduct. 
    Select(Function(c) New RadComboBoxData() With {.Text = c.FieldName3, .Value = c.FieldName3}). 
    ToArray() 
End Using 

Они производят SQL подобный код:

SELECT FieldName1 FROM Product 

Я хочу extact

Select(Function(c) New RadComboBoxData() With {.Text = c.SomeField, .Value = c.SomeField}).ToArray() 

в другой способ (что-то вроде этого, но он не работает).

<Extension()> 
Public Function ToRadComboBoxData(Of TSource, TItem)(ByVal source As IQueryable(Of TSource), selector As Expression(of Func(Of TSource, TItem))) As RadComboBoxData() 
    Dim r = (From row In source Select selector(row)).ToArray() 'Build tree from expression. How??? 
    Return (From v In r 
    Let rv = If(v Is Nothing, Nothing, v.ToString()) 
    Select New RadComboBoxData() With {.Text = rv, .Value = rv}).ToArray() 

End Function 

и сделать звонки в следующим образом:

Using ta As New QT_SSTEntities 
    Return ta.Product.ToRadComboBoxData(Function(c) c.FieldName1) 
End Using 

Using ta As New QT_SSTEntities 
    Return ta.City.ToRadComboBoxData(Function(c) c.CityName) 
End Using 

Using ta As New QT_SSTEntities 
    Return ta.OtherProduct.ToRadComboBoxData(Function(c) c.FieldName3) 
End Using 

ответ

1

Когда перечислены, IQueryable запрос транслируется в SQL. Но не все может быть переведено на SQL: например, создание RadComboBoxData не имеет смысла для базы данных SQL. Поэтому этот код необходимо выполнить в памяти, в результате запроса. Просто замените IQueryable с IEnumerable, и это должно дать вам ожидаемый результат:

<Extension()> 
Public Function ToRadComboBoxData(Of TSource, TItem)(ByVal source As IEnumerable(Of TSource), selector As Func(Of TSource, TItem)) As RadComboBoxData() 
    Return (From row In source 
    Let v = selector(row) 
    Let rv = If(v Is Nothing, Nothing, v.ToString()) 
    Select New RadComboBoxData() With {.Text = rv, .Value = rv}).ToArray() 
End Function 
+0

Да, он сейчас работает, спасибо! Последний вопрос - в этом случае EF генерирует sql для сбора всех полей из указанной таблицы. Было бы здорово выбрать только одно поле, прошедшее как Func <>. Поэтому нам нужно передать выражение, сгенерировать Select FieldName ... sql и после этого создать RadComboBoxData из IEnumerable. Как мы можем сделать это? – Cheburek

+0

Не уверен, что я понимаю ваш вопрос ... это то, что вы хотите? 'Return ta.Product.Select (Функция (p) => p.FieldName) .ToRadComboBoxData (Функция (c) c)' –

+0

Я обновил свой вопрос. См. Раздел ** Редактировать 2 ** в разделе – Cheburek

Смежные вопросы