Linqkit Generic Predicates with VB.NET

727 views Asked by At

I recently came across the wonderful Linqkit library and I want to make use of Generic Predicates to create a function for mapping users to the data they have access too accross any table that contains our data mapping fields. (H1L1, H1L2, etc)

Based on the tutorial (C# only) I see that this is indeed possible but I'm stuck.

So far I've created an interface:

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

Adjusted the Linq class for a table I'd like to operate on by adding Implements IDataMap and mapped each of the respective classes properties to the interface. I probably should have extended the linq class but for now i've just hardcoded the changes into the class generated by 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

But I'm not sure where to go from here... or where to put this function so it's accessible from anywhere in my project. My test function is basic:

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

Evenually I want to be able to say something similar to this:

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

The only way intellisense allows me to see that "mapUserToData" is available is if I put the function inside of my Linq Class... but then it's not generic. If I put the function inline in my code behind intellisense doesn't see my "mapUserToData" function as a method on my table. Maybe this is because of language/namespace differences between C# and VB.NET?

I'm a newbie to both .Net and Linq so please forgive me in advance for that.

I can use the linqkit predicate function successfully on an adhoc basis using

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()

But can't afford to replicate the data mapping logic each time I need it. If anyone knows how to help I will be forever in their debt!

1

There are 1 answers

1
NoAlias On BEST ANSWER

Try putting the mapUserToData function in a module as an Extension Method. Make it an extension of the IDataMap Interface.

<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