1

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

根据教程(仅限 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

Implements IDataMap 通过添加每个相应的类属性并将其映射到接口,为我想要操作的表调整了 Linq 类 。我可能应该扩展 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"))

智能感知让我看到“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()

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

4

1 回答 1

0

尝试将 mapUserToData 函数作为扩展方法放入模块中。使其成为 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
于 2013-12-07T01:01:17.923 回答