-2

LINQ を使用してデータベースのデータにアクセスしようとしていますが、データ型エラーが発生しています。

これが私のコードです:

public static String GetCheckIfCsIsRunning()
{
    using (Entities db = new Entities())
    {
        Stringl status = (from stat in db.Messenger_Settings
                          where stat.Id == 1
                          select stat.SettingValue);
        return status;
    }
}

現在、次の場所でエラーが発生しています

where stat.Id == 1

言って

Cannot implicitly convert type 'int' to 'bool'

テーブルから行の ID を選択しようとしていますが、コード行は ID が bool 型であると言っていますか? おそらく、コードの「ステータス」変数が「統計」をブール型に作成します。しかし、ID に従って行を選択するにはどうすればよいでしょうか。

私のテーブル構造は

ID(整数) | 名前 (varchar) | 設定値(varchar)

編集

「=」を追加するのを忘れていました (「=」 --> 「==」)

編集-2

int を bool の新しいエラーが発生したものに置き換えました - アクセスしたいデータは varchar です (stat.SettingValue を選択)

Cannot implicitly convert type 'System.LINQ.IQueryable,string.' to 'string'
4

4 に答える 4

2

等価演算子 (==) の代わりに代入演算子 (=) を誤って使用しています。

あなたのライン

where stat.Id = 1

実際には1 をに割り当てstat.IDますが、必要なものではありません。次に、割り当ては割り当てられた値 (この場合は 1) を返します。C# は暗黙的に を に変換しないintためbool、表示されるエラーが発生します。あなたがしたいのは、代わり==に等値演算子を使用することです。これは、あなたが期待することを行います: stat.Id の値が 1 であるかどうかを確認し、true または false を返します。

また、将来の参考のために、別のプログラミング イディオムを使用することで、このような偶発的な割り当てエラーを回避できます。つまり、最初に定数を置きます。

1 = stat.Id

どちらの方法でもエラーが発生しますが、偶発的な割り当てを行った場合、または暗黙的に変換される言語(追跡が困難な実行時エラー) では、代わりに1 のような数値リテラルに値を割り当てることはできないため、エラーが発生します。intbool


あなたの編集によると、LINQ は常に「遅延読み込み」クエリを返します。そのクエリの要素にアクセスしようとするとすぐに、それが列挙されます。IQueryableは、そのクエリのオブジェクト表現です。stringクエリが一連のs (0 以上) を表していることがわかっているので、いくつかのメソッドのいずれかを呼び出しIQueryable<string>て結果を得ることができます。

  • .First()シーケンスの最初の要素を返し、シーケンスに要素がない場合はスローします。
  • .FirstOrDefault()シーケンスの最初の要素を返すか、シーケンスに要素が含まれていない場合はデフォルト値を返します。
  • .Single()シーケンスに要素が 1 つしかない場合は要素を返し、それ以外の場合 (要素が 0 個または複数個ある場合) をスローします。
  • .SingleOrDefault()シーケンスに要素が 1 つしかない場合は要素を返し、要素がない場合はデフォルト値を返し、複数ある場合はスローします。

どちらを選択するかは、データベース スキーマとアプリケーションの望ましい動作によって異なります。設定の値が 1 つだけであることがわかっている場合は、 を使用して.Single()、エラーを出して、複数の結果が得られたかどうかを検出できるようにします。設定値が存在する可能性がある (または定義されていない可能性がある) 場合は、 を使用します.SingleOrDefault()。設定が表に複数の値を持つ可能性がある場合は、.First()またはを使用します.FirstOrDefault()

いずれにせよstring、予期しない結果が発生した場合に発生するのは、または実行時例外です。

于 2013-09-16T17:06:19.730 に答える
2

=代入演算子です。

比較演算子を使用して 2 つの値を比較し==ます。

于 2013-09-16T17:05:51.927 に答える
1

where stat.Id = 1する必要がありますwhere stat.Id == 1

比較を行うのではなく、値を設定しようとしています。

于 2013-09-16T17:06:05.370 に答える
1

ここには 2 つの問題があります。

まず、文字列 (varchar) を int に渡そうとしています。

第二に、あなたが持っているLINQは、intに行くことができないIEnumerableやIQueryableのようなものを生成します。

おそらくFirstFirstOrDefault, Sinle, を取得することを検討する必要があります。SingleOrDefault

于 2013-09-16T17:05:52.327 に答える