14

我怎么解决这个问题?

这是我的代码:

    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)”,该方法无法转换为存储库的表达式。

4

3 回答 3

34

对数据库执行的 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);

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

于 2012-07-14T02:35:42.593 回答
10

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/

于 2014-09-08T14:49:07.733 回答
6

在一行...

不要在 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();
于 2018-09-30T13:14:11.450 回答