Linq toEntityのFuncをジェネリックメソッドパラメーターとして使用する

シューター

SQLデータベースのテーブルを更新するEntityFrameworkに基づいた関数を作成したいと思います。

このテーブルには親子関係があるため、に基づいて多数の子を更新していparentIDます。

ジェネリック関数が欲しいのですが、コンパイル時に定義がわからないオブジェクトからIDを取得する方法がわかりません。

Funcかなりきれいなものを使用しようとしましたが、Linq-To-Entitiesでは使用できません。

コード:

protected static void update<TEntity>(DbSet<TEntity> set, int parentID,
  List<TEntity> entities, Func<TEntity, bool> isNew, Func<TEntity, int> getID = null, 
  Func<TEntity, int> getParentID, Action<TEntity, TEntity> updateSingleEntity)
        where TEntity : class
    {
        var currentIDs = entities.Select(e => getID(e));

        var newEntities = entities.Where(e => isNew(e));
        var existingEntities = entities.Where(e => !isNew(e));

        var deletedEntities 
          = set.Where(e => getParentID(e) == parentID && !currentIDs.Contains(getID(e)));

        foreach (var toAdd in newEntities)
        {
            set.Add(toAdd);
        }

        foreach (var toDelete in deletedEntities)
        {
            var entity = set.Find(getID(toDelete));
            set.Remove(entity);
        }

        foreach (var toUpdate in existingEntities)
        {
            var entity = set.Find(getID(toUpdate));
            updateSingleEntity(toUpdate, entity);
        }
    }

この関数を次のように使用したいと思います。

   update(set, parentID, someList, e => e.ID != 0, e => e.ID, e => ParentID, somefunc);

それはかなりきちんとしたIMOです。このような関数を実装する方法はありますか?

できない(試した):

IDプロパティを持つインターフェイスはすっきりすることができます。ただしparentID、このプロパティの名前はDB内のエンティティによって異なるため、このインターフェイスで定義することはできません

JotaBe

まず、コメントで言われているように、を使用する必要がありますExpression<Func<TEntity,int>> getId

それを使用するには、これを行うのではなくentities.Select(e => getID(e))、単にこれを行いentities.Select(getID)ます。その理由はSelect、ランバ式が必要でありgetId、ラムダ式が含まれているためですExpression<>それは表現の仕事にEFのために必要な木ではなく、コンパイル済みの表現ですので、必要です。詳細については、これを読むことができます

インターフェイスの代替ソリューションについては、次のように実装する必要があります。

public interface IId
{
   public int GetId();
}

次に、たとえば次のように、すべてのクラスに実装する必要があります。

public int GetId() { return parentId; }

または

public int GetId() { return parentId; }

また、次のように一般的なメソッドにインターフェイス制約を追加する必要があります。 where TEntity: class ,IId

ただし、2つの問題があります。

  1. GetIdすべてのエンティティタイプ(または少なくともこのメソッドで使用されるエンティティタイプ)に対してを実装する必要があります。
  2. GetIdEFは、SQL式に変換する方法を知りませんので、関数は、式ツリーに変換することができませんでした。(わかりませんが、エラーが発生する可能性もあります)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

linq内のメソッド引数からパラメータを使用する

分類Dev

このメソッド(string.Join()とLINQを使用)をジェネリックメソッドにするためのヘルプが必要です

分類Dev

c#はクラス変数をメソッドLINQのパラメーターとして渡しますか?

分類Dev

LINQクエリで「インクルード」メソッドを使用するとエラーが発生する

分類Dev

linq c#を使用して、またはジェネリックメソッド内で1つまたは2つのpropに値を割り当てる方法は?

分類Dev

メソッドのパラメーターとしてジェネリッククラスを使用する

分類Dev

LINQを使用して、オブジェクトのリストからパラメーターの個別のリストを取得する

分類Dev

VisualStudioでMartenを使用してLinqを使用して複数のパラメーターをクエリする

分類Dev

LINQで生成されたオブジェクトのメソッドをデリゲートとして渡す方法は?

分類Dev

.net 4.5バージョンのプロジェクト内の動的オブジェクトと.3.5の紛らわしいsystem.linqビュー内のAny()メソッドを使用したサードパーティアセンブリ

分類Dev

ジェネリックパラメータのないエンティティへのLinq

分類Dev

メソッド構文を使用したLINQクエリとしてのSQL「IN」

分類Dev

LINQ toEntity結合でのNULLチェックを防止します

分類Dev

LINQクエリの基本クラスで拡張メソッドを使用する

分類Dev

2つのパラメーターを使用してLINQクエリを作成する

分類Dev

linq 式をパラメーターとして作成する

分類Dev

linqを使用して複数のリストからオブジェクトのメソッドを実行する

分類Dev

メソッドパラメータJavaとしてジェネリックスを使用する

分類Dev

linqを使用してTableOjb1とTableObj2のラッパーオブジェクトを返す方法

分類Dev

C#のreturnメソッドを介してリスト内のlinqから複数のクラスモデルデータを返す

分類Dev

LINQクエリ構文をメソッド構文に変換する方法は?(結合と複数選択あり)問題:ここで-+ 3パラメーターのオーバーロードはありません

分類Dev

複数のパラメーターを使用してlinq式を作成する方法

分類Dev

.Select()を使用するメソッドを使用してLINQメソッド構文をLINQクエリ構文に変換します

分類Dev

Linqを使用して、リスト内のオブジェクトのメソッドによって返されたすべてのリストをマージします

分類Dev

テーブルをクエリするためのLinq拡張メソッド

分類Dev

LINQ結合でresultSelectorとしてファクトリメソッドを使用する方法

分類Dev

VB.Netはlinq-expressionをパラメーターとして渡し、その式でオブジェクトプロパティを設定します

分類Dev

linq(クエリ構文)の範囲変数をパラメーターとして使用することは可能ですか?

分類Dev

LINQメソッド構文を使用して複数のテーブルからデータを返す

Related 関連記事

  1. 1

    linq内のメソッド引数からパラメータを使用する

  2. 2

    このメソッド(string.Join()とLINQを使用)をジェネリックメソッドにするためのヘルプが必要です

  3. 3

    c#はクラス変数をメソッドLINQのパラメーターとして渡しますか?

  4. 4

    LINQクエリで「インクルード」メソッドを使用するとエラーが発生する

  5. 5

    linq c#を使用して、またはジェネリックメソッド内で1つまたは2つのpropに値を割り当てる方法は?

  6. 6

    メソッドのパラメーターとしてジェネリッククラスを使用する

  7. 7

    LINQを使用して、オブジェクトのリストからパラメーターの個別のリストを取得する

  8. 8

    VisualStudioでMartenを使用してLinqを使用して複数のパラメーターをクエリする

  9. 9

    LINQで生成されたオブジェクトのメソッドをデリゲートとして渡す方法は?

  10. 10

    .net 4.5バージョンのプロジェクト内の動的オブジェクトと.3.5の紛らわしいsystem.linqビュー内のAny()メソッドを使用したサードパーティアセンブリ

  11. 11

    ジェネリックパラメータのないエンティティへのLinq

  12. 12

    メソッド構文を使用したLINQクエリとしてのSQL「IN」

  13. 13

    LINQ toEntity結合でのNULLチェックを防止します

  14. 14

    LINQクエリの基本クラスで拡張メソッドを使用する

  15. 15

    2つのパラメーターを使用してLINQクエリを作成する

  16. 16

    linq 式をパラメーターとして作成する

  17. 17

    linqを使用して複数のリストからオブジェクトのメソッドを実行する

  18. 18

    メソッドパラメータJavaとしてジェネリックスを使用する

  19. 19

    linqを使用してTableOjb1とTableObj2のラッパーオブジェクトを返す方法

  20. 20

    C#のreturnメソッドを介してリスト内のlinqから複数のクラスモデルデータを返す

  21. 21

    LINQクエリ構文をメソッド構文に変換する方法は?(結合と複数選択あり)問題:ここで-+ 3パラメーターのオーバーロードはありません

  22. 22

    複数のパラメーターを使用してlinq式を作成する方法

  23. 23

    .Select()を使用するメソッドを使用してLINQメソッド構文をLINQクエリ構文に変換します

  24. 24

    Linqを使用して、リスト内のオブジェクトのメソッドによって返されたすべてのリストをマージします

  25. 25

    テーブルをクエリするためのLinq拡張メソッド

  26. 26

    LINQ結合でresultSelectorとしてファクトリメソッドを使用する方法

  27. 27

    VB.Netはlinq-expressionをパラメーターとして渡し、その式でオブジェクトプロパティを設定します

  28. 28

    linq(クエリ構文)の範囲変数をパラメーターとして使用することは可能ですか?

  29. 29

    LINQメソッド構文を使用して複数のテーブルからデータを返す

ホットタグ

アーカイブ