2017-02-07 4 views
0

こんにちは私は何をしようとしていますか?SYSIDの入力に基づいて、テスト目的のためだけにテーブルから名前のリストを見つけます。テーブルモデルとコントローラを使用したMVCモデルコーディング

モデル:

public DbSet<firsttest> firsttests { get; set; } 

表:

[Table("FirstTest")] 
    public class firsttest 
    { 
     public firsttest(){} 

     [Column("sysId")] 
     public long SysId { get; set; } 
     public string Name { get; set; } 
    } 

コントローラー:

[Authorize] 
    [Route("api/FirstTest/{SysId}")] 
    public List<String> Name(long SYSID) 
    { 
     using (AContext db = new AContext()) 
     { 
      var query = db.firsttests.Where(a => 1 == 1); 
      if (!String.IsNullOrEmpty(SYSID.ToString())) 
      { 
       query = query.Where(a => a.SysId.Equals(SYSID)).Select(a => a.Name); 
      } 
      return query.ToList(); 
     } 
    } 

エラー:暗黙的にSystem.Linq.Iqueryable(文字列)をSystem.Linq.Iqueryable(Model.firsttest)に変換できません

コードの変更方法はありますか?

答えて

1

このライン

var query = db.firsttests.Where(a => 1 == 1);

firsttestエンティティののIQueryableコレクションを返します。だから、変数queryの種類は、(理由は型推論のIQueryable<firsttest>ある

しかし、その後、あなたはNameプロパティを選択すると、その変数に異なるタイプ(IQueryable<string>)を設定しようとしています。

query = query.Where(a => a.SysId.Equals(SYSID)).Select(a => a.Name); 

この理由で、このコンパイルエラーが発生しています。

また、文字列ヌルまたは空のチェックにポイントがありません。 long値はNULL可能ではありません。したがって、ルートが機能するには有効な数値のlong値が必要です。ですから、where句でパラメータを使用するだけです。

[Route("api/FirstTest/{SysId}")] 
public List<String> Name(long SysId) 
{ 
    using (var db = new AContext()) 
    { 
    return db.firsttests // here the type is IQueryable<firsttest> 
       .Where(a => a.SysId.Equals(SysId)) 
       .Select(a => a.Name) // here the type is IQueryable<string> 
       .ToList(); // here the type of List<string> 
    } 
} 
+0

となる異なるタイプのクエリ参照を割り当てることができません。したがって、 'return'行の後に' select'を追加するだけですか?明示的にIQueryable からIQueryable に変換する必要のある明示的な変換方法はありますか? – LONG

+0

あなたはそれを変数に選択して保持し、戻ったり、単純に1行で実行したりできます。最終的にコンパイラは最適化し、1つのライナによって生成されたコードのようなコードを生成します。 – Shyju

+0

あなたのコードは完全に私のために説明しています、ちょうど興味があり、この行に対して明示的な変換はありませんか? 'query = query.Where(a => a.SysId.Equals(SYSID))。Select(a => a.Name)'は、IQueryable をIQueryable に変換しますか? – LONG

1

これを試してください。あなたが見ているこの現象は、var作品方法の性質のものである

if (!String.IsNullOrEmpty(SYSID.ToString())) 
{ 
    query = query.Where(a => a.SysId.Equals(SYSID)); // only filter here 
} 
return query.Select(a => a.Name).ToList(); // now project the result finally 

:あなたはちょうど同じようList<string>を返す前に、もしブロックし、プロジェクトにそこに結果を絞り込むことができます

[Authorize] 
[Route("api/FirstTest/{SysId}")] 
public List<String> Name(long SYSID) 
{ 
    using (SpaContext db = new SpaContext()) 
    { 
     var query = db.firsttests.Where(a => 1 == 1); 
     if (!String.IsNullOrEmpty(SYSID.ToString())) 
     { 
      query = query.Where(a => a.SysId.Equals(SYSID)); 
     } 
     return query.Select(a => a.Name).ToList(); 
    } 
} 
1

C#で。

あなたがvar query = db.firsttests.Where(a => 1 == 1);を書くとき、変数queryは今タイプIQueryable<Model.firsttest>のものであり、今ダウンのコードでは、変数queryにプロジェクトの後にあなたのケースで結果がSystem.Linq.Iqueryable<string>になります異なるタイプの参照を割り当てることはできません。

あなたは以下のより詳細にそれについて読むことができます:

https://msdn.microsoft.com/en-us/library/bb384061.aspx

What does "var" mean in C#?

+0

これは私のために働く!しかしなぜ私のコードのように 'return'の前に' select'を指定できないのですか?明示的な変換方法が必要ですか? – LONG

+0

'var query = db.firsttests.Where(a => 1 == 1);'と書くと、 'query'は' IQueryable 'で強く型付けされています。クエリで 'System.Linq.Iqueryable ' –

関連する問題