Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 实体框架的扩展选择方法_Vb.net_Linq_Entity Framework 4.1 - Fatal编程技术网

Vb.net 实体框架的扩展选择方法

Vb.net 实体框架的扩展选择方法,vb.net,linq,entity-framework-4.1,Vb.net,Linq,Entity Framework 4.1,我有许多类似的数据库调用,它们工作得很好 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

我有许多类似的数据库调用,它们工作得很好

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()
进入另一种方法(smth.like that,但它不起作用)


枚举时,将
IQueryable
查询转换为SQL。但并非所有内容都可以转换为SQL:例如,创建
RadComboxData
对于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

公共函数ToradComboxData(属于TSource,TItem)(ByVal源作为IEnumerable(属于TSource),选择器作为Func(属于TSource,TItem))作为RadComboxData()
返回(来自源中的行)
设v=选择器(行)
设rv=If(v为Nothing,Nothing,v.ToString())
选择带有{.Text=rv、.Value=rv}.ToArray()的新RadComboxData()
端函数

枚举时,将
IQueryable
查询转换为SQL。但并非所有内容都可以转换为SQL:例如,创建
RadComboxData
对于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

公共函数ToradComboxData(属于TSource,TItem)(ByVal源作为IEnumerable(属于TSource),选择器作为Func(属于TSource,TItem))作为RadComboxData()
返回(来自源中的行)
设v=选择器(行)
设rv=If(v为Nothing,Nothing,v.ToString())
选择带有{.Text=rv、.Value=rv}.ToArray()的新RadComboxData()
端函数

是的,现在可以用了,谢谢!最后一个问题-在本例中,EF生成sql来收集指定表中的所有字段。最好只选择作为Func传递的单个字段。所以我们需要传递一个表达式,生成Select FieldName。。。sql,然后从IEnumerable创建RadComboBoxData。我们怎么能这么做?我不太明白你的问题。。。这是你想要的吗<代码>返回ta.Product.Select(函数(p)=>p.FieldName).toradComboxData(函数(c)c)我已经更新了我的问题。请参阅主题的编辑2部分。请注意,如果使用此策略,查询将在调用此方法之前具体化。因此,如果您只对
rv
值感兴趣,但源对象上有许多其他数据,那么您可能会从数据库中获得比实际需要多得多的信息。而且这个策略绝对不应该扩展到
Where
子句。。。。然而,当我进一步了解这一点时,ToradComboxData方法不应该用于非物质化查询:它属于前端。所以+1。是的,现在可以了,谢谢!最后一个问题-在本例中,EF生成sql来收集指定表中的所有字段。最好只选择作为Func传递的单个字段。所以我们需要传递一个表达式,生成Select FieldName。。。sql,然后从IEnumerable创建RadComboBoxData。我们怎么能这么做?我不太明白你的问题。。。这是你想要的吗<代码>返回ta.Product.Select(函数(p)=>p.FieldName).toradComboxData(函数(c)c)我已经更新了我的问题。请参阅主题的编辑2部分。请注意,如果使用此策略,查询将在调用此方法之前具体化。因此,如果您只对
rv
值感兴趣,但源对象上有许多其他数据,那么您可能会从数据库中获得比实际需要多得多的信息。而且这个策略绝对不应该扩展到
Where
子句。。。。然而,当我进一步了解这一点时,ToradComboxData方法不应该用于非物质化查询:它属于前端。所以+1。
<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