【问题标题】:Linqkit Generic Predicates with VB.NETVB.NET 的 Linqkit 泛型谓词
【发布时间】:2013-12-07 09:01:17
【问题描述】:

我最近遇到了很棒的 Linqkit 库,我想利用 Generic Predicates 创建一个函数,用于将用户映射到他们可以访问的数据,这些数据也可以跨越包含我们的数据映射字段的任何表。 (H1L1、H1L2 等)

基于tutorial(仅限C#)我看到这确实是可能的,但我被卡住了。

到目前为止,我已经创建了一个界面:

Public Interface IDataMap
    ReadOnly Property H1L1() As String
    ReadOnly Property H1L2() As String
    ReadOnly Property H1L3() As String
    ReadOnly Property H2L1() As String
    ReadOnly Property H2L2() As String
    ReadOnly Property H2L3() As String
    ReadOnly Property H3L1() As String
    ReadOnly Property H3L2() As String
    ReadOnly Property H3L3() As String
End Interface

为我想操作的表调整了 Linq 类,添加 Implements IDataMap 并将每个相应的类属性映射到接口。我可能应该扩展 linq 类,但现在我只是将更改硬编码到 VS 生成的类中。

<Global.System.Data.Linq.Mapping.ColumnAttribute(Storage:="_H1L1", DbType:="VarChar(30)")> _
Public ReadOnly Property H1L1() As String Implements IDataMap.H1L1
    Get
        Return Me._H1L1
    End Get
End Property

但我不知道从这里去哪里......或者把这个函数放在哪里,以便可以从我项目中的任何地方访问它。我的测试功能是基本的:

Public Shared Function mapUserToData(Of TEntity As IDataMap)(H1L1 As String) As Expression(Of Func(Of TEntity, Boolean))

      Return Function(x) (H1L1 = x.H1L1))

End Function

我什至希望能够说类似这样的话:

DB.someTables.Where(someTable.mapUserToData("345BDS"))

intellisense 让我看到“mapUserToData”可用的唯一方法是,如果我将函数放在我的 Linq 类中......但它不是通用的。如果我将函数内联在我的代码中 intellisense 不会将我的“mapUserToData”函数视为我表上的方法。也许这是因为 C# 和 VB.NET 之间的语言/命名空间差异?

我是 .Net 和 Linq 的新手,所以请提前原谅我。

我可以使用 linqkit 谓词函数成功地使用

Dim predicate = PredicateBuilder.False(Of someTable)()
predicate = predicate.Or(Function(p) p.H1L1 IsNot Nothing)
Dim PgmED = (From x In DB.someTables.Where(predicate) Select x).AsEnumerable()

但我无法在每次需要时都复制数据映射逻辑。如果有人知道如何提供帮助,我将永远欠他们的债!

【问题讨论】:

    标签: vb.net predicatebuilder linqkit


    【解决方案1】:

    尝试将 mapUserToData 函数作为 Extension Method 放入模块中。使其成为 IDataMap 接口的扩展。

    <Extension()> _
    Public Function mapUserToData(Of TEntity As IDataMap)(ByVal objTarget As IDataMap, H1L1 As String) As Expression(Of Func(Of TEntity, Boolean))
    
        Return Function(x) (H1L1 = x.H1L1)
    
    End Function
    

    【讨论】:

    • 谢谢!实际上,我最终放弃了 linqkit 中的谓词构建器,而只使用了您提到的扩展方法。工作函数如下所示::: Public Function mapUserToData(Of T As IDataMap)(ByVal source As IQueryable(Of T), UID As String) As IQueryable(Of T) ... End Fucntion
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多