【发布时间】: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