我最近遇到了很棒的 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()
但是每次我需要它时都无法复制数据映射逻辑。如果有人知道如何提供帮助,我将永远欠他们的债!