0

基本的に、基本クラスをパラメーターとして取り、派生クラスに「ジェネリック」に使用できるメソッドを作成したいと思います

ef-code-first クラス:

基本クラス

public abstract class BaseClass
{
    public int Id { get; set; }
    public string Name { get; set; }
}

派生クラス:

public class DerivedA:BaseClass
{
    public string AValue {get;set;}
    ...more specific fields
}


public class DerivedB:BaseClass
{
    public string BValue {get;set;}
    ..... more specific fields
}

これらのわずかに異なるオブジェクトで「ジェネリック メソッド」を呼び出します。

System.Data.Entity.DbSet<DerivedA> _dA....
System.Data.Entity.DbSet<DerivedB> _dB....

genericMethod(_dA.Where(a => a.Name.StartsWith("a name")))); //<-contains records
genericMethod(_dB.Where(a => a.Id==5)); //<---- contains records

両方の「場所...」にデバッグ中のレコードが含まれています ([列挙] をクリックした後)

今方法:

public string genericMethod(<IQueryable>BaseClass _myClass)
{
    foreach (BaseClass c in _myClass)  // <-------class is empty - no records
        {
          // do something usefull...
        }
    return someResult 
}

ただし、メソッド内にある場合、レコードは含まれません。

それは可能ですか、私がやろうとしていることは...? それは理にかなっていますか?

設計時、コンパイル時、または実行時エラーはありませんが、渡されたオブジェクトにはメソッドに渡されたときにレコードが含まれていませんが、呼び出しステートメントにレコードが含まれていました。

私は何を間違えましたか?

より良いアプローチはありますか?-

2つ以上(おそらく10個)の派生クラスを操作するには、このメソッドが必要です。そのため、「ジェネリック」が必要です。

ありがとうございました!

4

2 に答える 2

1

このような問題に直面したとき、私は自分のコードを単純化するのが好きです。

_dA.Where(a => a.Name.StartsWith("a name"))メソッド呼び出しからandを削除して、_dB.Where(a => a.Id==5)最初にそれらを変数に入れてみます (そして、変数をメソッドに渡します)。

これにより、コードをよりよく検査し、問題を明らかにすることができます。

于 2012-10-24T20:55:47.220 に答える
0

.ToList()を追加して、クエリをメソッドに渡す前に具体化します。

genericMethod(_dA.Where(a => a.Name.StartsWith("a name"))).ToList());

それ以外の場合は、クエリの結果を実際に渡すのではなく、最初に評価する必要のあるクエリを渡すだけです。ToList()がそれを評価します。デバッガーウォッチを見ると、基本的にその場で評価されているため、行が返されます。

その後、IQueryableではなくIListを処理するようにメソッドを変更します。

于 2012-10-24T21:13:12.940 に答える