LINQ to Entities无法识别方法'System.String get_Item(System.String)',

mca*_*ara 13 c# asp.net-mvc linq-to-entities

我怎么解决这个问题?

这是我的代码:

    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);
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

LINQ to Entities无法识别方法'System.String get_Item(System.String)',该方法无法转换为存储库的表达式.

Tho*_*que 31

针对数据库执行的Linq查询在执行之前会被转换为SQL; 但collection["txtDtInicial"]无法转换为SQL,因为没有等效的SQL语法,无论如何数据库都没有访问权限collection.您需要首先提取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);
Run Code Online (Sandbox Code Playgroud)

通过初始化dtIniciodtFimMinValue和MaxValue,您无需检查它们是否在查询中定义.

  • 人们不得不问为什么LINQ不比这更聪明? (3认同)

小智 7

Linq查询最终转换为SQL查询,LINQ不知道如何处理Session ["UserName"](获取"UserName"项).

解决此问题的常用方法是使用您将分配Session ["UserName"]的局部变量以及您将在Linq查询中使用的局部变量...

喜欢

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

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


小智 5

一行...

不要在Linq(Entity)查询中使用STRING转换函数!

错误:

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

正确:

string Name = dt.Rows[i]["Name"].ToString();
user = db.Users.Where(u => u.Name == Name).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)