8

データベースに 2 つの異なるテーブルがあり、それぞれが「SortOrder」に基づいてユーザーに表示されます。行 (またはエンティティ) を受け取り、その並べ替え順序をそれに最も近い順序 (実行されている関数に応じて上または下) に入れ替える 2 つの関数を作成しました。イベントが発生している場所 (同じ機能を持つ複数のグリッドビュー) に応じて、これらの関数を 2 つの異なるテーブルで機能させる必要があります。これが私がこれまでに持っているものです(繰り返しますが、 move downにはほぼ同じ機能がありますが、冗長になるため投稿しません):

protected void moveUp(String ValId, String dbName)
    {
        int ValueId = Convert.ToInt32(ValId);
        DataModel.DataAccess.Entities dc = new DataModel.DataAccess.Entities();
        if (dbName.ToLower() == "table1")
        {
            DataModel.DataAccess.Table1 currentValue = dc.Table1.Single(table1item => table1item.Table1ItemId == ValueId);
        }
        else if (dbName.ToLower() == "table2")
        {
            DataModel.DataAccess.Table2 currentValue = dc.Table2.Single(table2item => table2item.Table2ItemId == ValueId);
        }
        try
        {
            //make the change and update the database and gridview
        }
        catch (InvalidOperationException)
        {
        }
    }

明らかな問題は、if ステートメントの前にcurrentValue変数を開始する必要があることです。そうしないと、変数が宣言されない可能性があり、したがって、関数の残りの部分 (currentValue 変数を使用する) が機能しません。

私の質問は次のとおりです。変数がまだどうなるかわからない場合、if ステートメントの前にどのように変数を初期化すればよいですか? 私はこれがうまくいくかもしれないと思っていましたが、まだ初期化する必要があると言われています (「暗黙的に型指定されたローカル変数を初期化する必要があります」):

    var currentValue; //this is the line where I get the error message above
    if (dbName.ToLower() == "table1")
    {
        currentValue = (DataModel.DataAccess.Table1)dc.Table1.Single(table1item => table1item.Table1ItemId == ValueId);
    }
    else if (dbName.ToLower() == "table2")
    {
        currentValue = (DataModel.DataAccess.Table2)dc.Table2.Single(table2item => table2item.Table2ItemId == ValueId);
    }

[編集]私の質問をより正確に反映するようにタイトルを変更しました

4

5 に答える 5

9

C# では、すべての型に型が必要です。Table#タイプが extendsの場合、DataModel.DataAccess.Tableこれを使用します。

DataModel.DataAccess.Table currentValue;

それ以外の場合は、共通の基本クラスを見つける必要があります (オブジェクトはそれらすべての曾孫です)。

object currentValue;

を初期化しなかったためcurrentValue、コンパイラは が意味する型を認識できませんvar。そのため、例外が発生しています。

補遺: おそらく、テーブルの名前を渡す代わりに、次のような一般的なメソッドを使用できます。

moveUp(dc.Table1, item => item.Table1Key, "george");

void moveUp<T> (IEnumerable<T> table, Func<T,string> keySelector, string ValId)
{
    T currentValue = table.Single(item => keySelector(item) == ValueId);

    try
    {
        //make the change and update the database and gridview
    }
    catch (InvalidOperationException)
    {
    }
}
于 2011-06-28T18:10:39.427 に答える
3

var の代わりに type object を使用しますが、おそらくこの proc 全体を書き直して、一貫した (そして標準の) 命名規則を使用します。

それで:

object currentValue = null;
于 2011-06-28T18:09:37.933 に答える
2

各エンティティが使用するインターフェイスと、そのインターフェイスを受け入れる関数を作成してみてください。

public interface ISortableEntity
{
    int ID { get; set; }
    int SortOrder { get; set; }
}


 public class DataFunctions
{
    public static void MoveUp(string dbName, int valID)
    {
        var db = //Get your context here;
        List<KeyValuePair<string, object>> keys = new List<KeyValuePair<string, object>>();
        keys.Add(new KeyValuePair<string, object>("ID", valID));

        ISortableEntity entity = db.GetObjectByKey(new System.Data.EntityKey(dbName, keys)) as ISortableEntity;

        if (entity != null)
        {
            entity.SortOrder += 1;
        }

        db.SaveChanges();
    }
}
于 2011-06-28T18:12:29.060 に答える
0

解決策はインターフェースです。Table 1 と Table 2 のクラスは、CurrentValue のプロパティを持つインターフェイス (ISortableTable など、任意の名前) を実装する必要があります。Table1 の CurrentValue プロパティの実装は、Table1 に対して正しい結果を返し、Table2 の CurrentValue プロパティは Table2 に対して正しい結果を返します。次に、並べ替え関数は、ISortableInterface を実装する任意のクラスで動作し、それぞれのオブジェクトの CurrentValue プロパティで動作します。

于 2011-06-28T18:18:13.843 に答える
0

変数の型がわからないので、暗黙的に宣言しています (たとえば、「int」ではなく「var」)。

明示的な型を初期化する必要はありません。暗黙的な型は、指定された値によって型を把握するため、初期化が必要です。

于 2011-06-28T18:11:21.543 に答える