Расширение Выберите методы для Entity Framework - PullRequest
1 голос
/ 14 декабря 2011

У меня много похожих вызовов в базу данных, и они отлично работают

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

Я хочу вымогать

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 Ответ

1 голос
/ 15 декабря 2011

При перечислении запрос 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...