1

私は最近、すばらしい Linqkit ライブラリに出会いました。ジェネリック述語を使用して、データ マッピング フィールドを含むテーブル全体でユーザーがアクセスできるデータにユーザーをマッピングする関数を作成したいと考えています。(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 関数を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
于 2013-12-07T01:01:17.923 に答える