Linqkit Generic用VB.NET进行谓词化

时间:2013-12-06 23:01:20

标签: vb.net predicatebuilder linqkit

我最近遇到了很棒的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的新手,所以请提前原谅我。

我可以使用

在adhoc基础上成功使用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()

但是每次我需要时都无法复制数据映射逻辑。如果有人知道如何帮助我将永远负债!

1 个答案:

答案 0 :(得分:0)

尝试将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