【问题标题】:OrderBy Linq.Expression as parameter = (Of Func(Of T,IComparable)) to perform LinqToEntity is not workingOrderBy Linq.Expression 作为参数 = (Of Func(Of T,IComparable)) 来执行 LinqToEntity 不起作用
【发布时间】:2012-04-06 22:25:54
【问题描述】:

我想让这个工作:

DBSet 构造函数:

dbset = DataContext().[Set](Of T)()

调用:(Count & Page 用于分页,例如 Count = 20 和 Page = 1,用于前 20 个值)。应按名称排序

LeverancierService.GetLeveranciers(Function(el) el.Name, Count, Page)

c# 中的等价物: LeverancierService.GetLeveranciers(el=> el.Name, Count, Page)

给出错误的方法(如上所示的参数):

 Public Overridable Function GetAllPaged(orderby As Expression(Of Func(Of T, IComparable)), ByVal Count As Integer, ByVal Page As Integer) As IEnumerable(Of T)
      Return dbset.OrderBy(orderby).Skip((Page - 1) * Count).Take(Count).ToList()
 End Function

已经试过改成这个了,还是报同样的错误:

 Public Overridable Function GetAllPaged(Of TOrderBy)(orderby As Expression(Of Func(Of T, TOrderBy)), ByVal Count As Integer, ByVal Page As Integer) As IEnumerable(Of T)
        Return dbset.OrderBy(orderby).Skip((Page - 1) * Count).Take(Count).ToList()
 End Function

错误:

 Unable to cast the type 'System.String' to type 'System.IComparable'. LINQ to Entities only supports casting Entity Data Model primitive types.

知道怎么做吗?

额外信息:

我在一个 DDD 分层的应用程序中,所以参数应该保持不变,因为被调用的方法是一个被覆盖的接口(例如,如果我改变这个,我必须这样做 200 次左右,因为它在VB.Net 而不是 C#(= 1 处更改))

【问题讨论】:

  • 你能添加更多关于你的数据库集的数据吗?您的数据库集是如何定义的?像这样? : DataContext.Set(Of TEntity)?
  • 私有只读数据库集作为 IDbSet(Of T)
  • dbset = DataContext().[Set](Of T)()

标签: vb.net linq entity-framework-4 lambda


【解决方案1】:

这是我的示例。我希望它能解决你的问题:

如果您的数据库集类型未定义

Public Function Test(Of TEntity As Class, TKey) _
    (keySelector As Expression(Of Func(Of TEntity, TKey))) As IList(Of TEntity)
    Return DataContext.Set(Of TEntity).OrderBy(keySelector).ToList
End Function

用法:

Repository.Test(Function(obj As MyEntity) obj.Name)

如果您的 dbset 类型已定义,您可以使用此其他示例:

    Public Function Test2(Of TKey) _
        (keySelector As Expression(Of Func(Of MyEntity, TKey))) _
        As IList(Of MyEntity)
        Return DataContext.Set(Of MyEntity).OrderBy(keySelector).ToList
    End Function

这样使用:

Repository.Test(Function(obj) obj.Name)

【讨论】:

  • 很奇怪。我的函数的第二个解决方案(根据我)是完全相似的。你测试过吗?
  • 它是从我自己的一个项目中复制而来的,我会尽快更新我的答案并包含我项目中的实际代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多