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

时间:2012-04-14 19:29:20

标签: 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);

我得到的错误是:

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

3 个答案:

答案 0 :(得分: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);

通过将dtIniciodtFim初始化为MinValue和MaxValue,您无需检查它们是否在查询中定义。

答案 1 :(得分:7)

Linq查询最终转换为SQL查询,LINQ不知道如何处理Session [&#34; UserName&#34;](获取&#34; UserName&#34;项目)

解决此问题的一种常见方法就是使用一个本地变量,您将为其分配会话[&#34;用户名&#34;]以及您将在Linq查询中使用的变量...

喜欢

string loggedUserName = Session [&#34; LogedUsername&#34;]。ToString();
  var userdetail = dc.faculties.Where(a =&gt; a.F_UserName.Equals(loggedUserName))。FirstOrDefault();

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

答案 2 :(得分:5)

一行...

请勿在Linq(实体)查询中使用字符串转换功能!

错误:

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