2012-04-14 17 views
9

この問題を解決するにはどうすればよいですか?ここでLINQ to Entitiesは、 'System.String get_Item(System.String)'メソッドを認識しません。

は私のコードです:私は取得しています

DateTime dtInicio = new DateTime(); 
    DateTime dtFim = new DateTime(); 
    Int32 codStatus = 0; 

    if(!string.IsNullOrEmpty(collection["txtDtInicial"])) 
     dtInicio = Convert.ToDateTime(collection["txtDtInicial"]); 
    if(!string.IsNullOrEmpty(collection["txtDtFinal"])) 
     dtFim = Convert.ToDateTime(collection["txtDtFinal"]); 
    if (!string.IsNullOrEmpty(collection["StatusCliente"])) 
     Convert.ToInt32(collection["StatusCliente"]); 

    var listCLientResult = (from c in db.tbClientes 
          orderby c.id 
          where (c.effdt >= dtInicio || string.IsNullOrEmpty(collection["txtDtInicial"]) && 
           (c.effdt <= dtFim || string.IsNullOrEmpty(collection["txtDtFinal"])) && 
           (c.cod_status_viagem == codStatus || string.IsNullOrEmpty(collection["StatusCliente"]))) 
           select c); 
    return View(listCLientResult); 

エラーがある:エンティティへ

LINQは、どれができない、方法 '可能System.String get_Item(可能System.String)' を認識しません。リポジトリの表現に変換することができます。

+0

この答えを見てみてください。 http://stackoverflow.com/questions/7259567/linq-to-entities-does-not-recognize-the-method グリーティング – MUG4N

+0

はい、推奨される質問をご覧ください。その理由はエラーが発生した理由です。http://stackoverflow.com/a/5541505/1109444では、動作中のクエリを作成する方法が説明されています。 – Hari

+0

[LINQ to Entities]の複製がSystem.String ToString()メソッドを認識しません](http://stackoverflow.com/questions/4121863/linq-to-entities-does-not-recognize-the- method-system-string-tostring-method) –

答えて

28

データベースに対して実行されたLinqクエリは、実行前にSQLに変換されます。 collection["txtDtInicial"]は同等のSQL構文が存在しないため、SQLに変換できません。とにかくデータベースにはcollectionへのアクセス権がありません。最初に変数にcollection["txtDtInicial"]を抽出し、この変数のみをクエリで使用する必要があります。

は、ここで私はどうなるのかです:MinValueプロパティとMaxValueをするdtIniciodtFimを初期化することによって

DateTime dtInicio = DateTime.MinValue; 
DateTime dtFim = DateTime.MaxValue; 
Int32 codStatus = 0; 

if(!string.IsNullOrEmpty(collection["txtDtInicial"])) 
    dtInicio = Convert.ToDateTime(collection["txtDtInicial"]); 
if(!string.IsNullOrEmpty(collection["txtDtFinal"])) 
    dtFim = Convert.ToDateTime(collection["txtDtFinal"]); 
if (!string.IsNullOrEmpty(collection["StatusCliente"])) 
    codStatus = Convert.ToInt32(collection["StatusCliente"]); 

var listCLientResult = (from c in db.tbClientes 
         orderby c.id 
         where (c.effdt >= dtInicio) && 
          (c.effdt <= dtFim) && 
          (c.cod_status_viagem == codStatus) 
          select c); 
return View(listCLientResult); 

、あなたは彼らがクエリに定義されているかどうかをチェックする必要はありません。

+3

LINQがこれよりもスマートではない理由を聞かなければなりませんか? – PeterX

+2

@PeterX、まあ、LinqはすでにかなりスマートなIMOです... –

+0

これは私の問題でした –

5

Linqクエリは最終的にSQLクエリに変換され、LINQはSession ["UserName"]( "UserName"アイテムを取得)で何をするかを知らない。

よう

この問題を回避するための一般的な方法は、ちょうどあなたがセッション[「ユーザー名」]を割り当てると、あなたのLINQクエリで使用しますということでしょうしているローカル変数を使用することです...

文字列loggedUserName =セッション["LogedUsername"]。ToString();
var userdetail = dc.faculties.Where(a => a.F_UserName.Equals(loggedUserName))。FirstOrDefault();

参照http://mvc4asp.blogspot.in/

関連する問題