web-dev-qa-db-ja.com

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 to Entitiesは、リポジトリの式に変換できないメソッド 'System.String get_Item(System.String)'を認識しません。

13
mcamara

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

これが私がすることです:

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);

dtIniciodtFimをMinValueとMaxValueに初期化することにより、それらがクエリで定義されているかどうかを確認する必要はありません。

31
Thomas Levesque

Linqクエリは最終的にSQLクエリに変換され、LINQはSession ["UserName"]( "UserName"アイテムを取得する)をどう処理するかを知りません。

これを回避する一般的な方法は、Session ["UserName"]を割り当て、Linqクエリで使用するローカル変数を使用することです...

お気に入り

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

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

8
ravi saini

一行で...

Linq(Entity)クエリで文字列変換関数を使用しないでください!

間違っています:

user = db.Users.Where(u => u.Name == dt.Rows[i]["Name"].ToString()).FirstOrDefault();

正解:

string Name = dt.Rows[i]["Name"].ToString();
user = db.Users.Where(u => u.Name == Name).FirstOrDefault();
6
Amit Kadam