C# 不要惨败: || log.Timestamp.ToString(CultureInfo.CurrentUICulture).Contains(search)

C# 不要惨败: || log.Timestamp.ToString(CultureInfo.CurrentUICulture).Contains(search),c#,mysql,sql,linq,C#,Mysql,Sql,Linq,删除有问题的行并解决问题。 我不完全理解为什么,但似乎ToString()是字符串的LINQ表达式,而不是实体的LINQ表达式。LINQforEntities处理像SQL这样的数据库查询,而SQL没有ToString()的概念。因此,我们不能将ToString()放入.Where()子句中 但是第一行是如何工作的呢?SQL没有使用ToString(),而是使用了CAST和CONVERT,因此到目前为止,我最好的猜测是linq for entities在一些简单的情况下使用了它。DateTime对

删除有问题的行并解决问题。

我不完全理解为什么,但似乎ToString()是字符串的LINQ表达式,而不是实体的LINQ表达式。LINQforEntities处理像SQL这样的数据库查询,而SQL没有ToString()的概念。因此,我们不能将ToString()放入.Where()子句中


但是第一行是如何工作的呢?SQL没有使用ToString(),而是使用了
CAST
CONVERT
,因此到目前为止,我最好的猜测是linq for entities在一些简单的情况下使用了它。DateTime对象并不总是这么简单…

将表强制转换为可枚举的,然后使用内部的
ToString()方法调用LINQ方法:

    var example = contex.table_name.AsEnumerable()
.Select(x => new {Date = x.date.ToString("M/d/yyyy")...)

但在调用
AsEnumerable
ToList
方法时要小心,因为在此方法之前,您将从所有实体请求所有数据。在我上面的例子中,我通过一个请求读取所有
表\u name

升级到实体框架6.2.0版对我来说很有效

我以前使用的是6.0.0版


希望这有帮助,

请注意,这将从数据库中检索所有页面实体,并在客户端而不是数据库中进行筛选。。通常不是一件好事。对于包含多个记录的任何表,这种方法确实是低效的,这意味着存在的所有表:-)。然而,这个答案今天确实帮助了我,因为我在做一个.Select投影,其中包括toString(),所以在我之前调用.ToList()对我没有性能损失,调用.ToList()允许我使用.toString()格式和.Select语句……如果我的toString()应用在等式的左侧会怎么样?e、 g.p.Serial.ToString()=item.@dotNet仍然会失败,因为整个get已转换为表达式,实体框架试图转换为有效的SQL。它知道如何处理某些方法,但是
ToString()
不是其中之一。@Josh:我知道它会失败。我所要求的是一个解决方案,因为上面的解决方案显然不能应用到那里。@Josh:我正在与这样的场景作斗争。假设我的OrderNumber列为int,但我的用户希望能够在键入时筛选OrderNumber列表。如果他在搜索框中键入了143,他只需要那些订单号为“%143%”的记录。我不需要对OrderNumber列执行ToString()来实现它吗?@dotNET这是ORM掉到它脸上的场景之一。我认为在这些情况下,通过
ExecuteQuery
直接使用SQL或者通过使用实体SQL和
ObjectQuery
“任何时候都需要使用方法调用”都是一个糟糕的建议——对于许多记录来说,这可能是一个大问题。对于这个场景,公认的答案要好得多。他们在.NET4中添加了SqlFunctions类,我只是在了解它?非常好的发现。为了更好的实践,或者在生产类型的代码中,您应该始终将数据库事件放在服务层或数据层中,而不是直接放在操作中。应该使用FirstOrDefault,而不仅仅是First。。。如果是主键,则使用Find,因为这样性能更好。@TGarrett
First
的唯一用法是关于返回
MethodInfo[]
GetMethods()
的结果。好吧,
MethodInfo[]
没有
Find
方法,也没有这样的扩展方法。但是我真的应该使用
Single
,因为这个方法是通过反射找到的,如果无法解决相应的方法,就不会出现编译时错误。通常这不是一个好选择,.AsEnumerable()将所有数据放在内存中,您可以在这里看到更多关于它的信息:相关的post-&query。其中(x=>SomeGuidassString.Contains(x.AGuid.ToString())->不适用于EF 6.0.0.0;但适用于6.1.3(已在6.1.3和6.4.4上进行了测试)
var keyString = item.Key.ToString();

var pages = from p in context.entities
            where p.Serial == keyString
            select p;
var strItem = item.Key.ToString();

IQueryable<entity> pages = from p in context.pages
                           where  p.Serial == strItem
                           select p;
IQueryable<entity> pages = context.pages.ToList().Where(p=>p.serial == item.Key.ToString())
from p in context.pages
where  p.Serial == SqlFunctions.StringConvert((double)item.Key.Id)
select p;
[HttpPost]
[ActionName("Index")]
public ActionResult SearchRecord(FormCollection formcollection)
{       
    EmployeeContext employeeContext = new EmployeeContext();

    string searchby=formcollection["SearchBy"];
    string value=formcollection["Value"];

    if (formcollection["SearchBy"] == "Gender")
    {
        List<MvcApplication1.Models.Employee> emplist = employeeContext.Employees.Where(x => x.Gender == value).ToList();
        return View("Index", emplist);
    }
    else
    {
        List<MvcApplication1.Models.Employee> emplist = employeeContext.Employees.Where(x => x.Name == value).ToList();
        return View("Index", emplist);
    }         
}
using System.Linq;
using System.Data.Entity.SqlServer;
using System.Linq.Expressions;
using static System.Linq.Expressions.Expression;
using System;

namespace ToStringRewriting {
    class ToStringRewriter : ExpressionVisitor {
        static MethodInfo stringConvertMethodInfo = typeof(SqlFunctions).GetMethods()
                 .Single(x => x.Name == "StringConvert" && x.GetParameters()[0].ParameterType == typeof(decimal?));

        protected override Expression VisitMethodCall(MethodCallExpression node) {
            var method = node.Method;
            if (method.Name=="ToString") {
                if (node.Object.GetType() == typeof(string)) { return node.Object; }
                node = Call(stringConvertMethodInfo, Convert(node.Object, typeof(decimal?));
            }
            return base.VisitMethodCall(node);
        }
    }
    class Person {
        string Name { get; set; }
        long SocialSecurityNumber { get; set; }
    }
    class Program {
        void Main() {
            Expression<Func<Person, Boolean>> expr = x => x.ToString().Length > 1;
            var rewriter = new ToStringRewriter();
            var finalExpression = rewriter.Visit(expr);
            var dcx = new MyDataContext();
            var query = dcx.Persons.Where(finalExpression);

        }
    }
}
var result = Db.SystemLog
.Where(log =>
    eventTypeValues.Contains(log.EventType)
    && (
        search.Contains(log.Id.ToString())
        || log.Message.Contains(search)
        || log.PayLoad.Contains(search)
        || log.Timestamp.ToString(CultureInfo.CurrentUICulture).Contains(search)
    )
)
.OrderByDescending(log => log.Id)
.Select(r => r);
|| log.Timestamp.ToString(CultureInfo.CurrentUICulture).Contains(search)
    var example = contex.table_name.AsEnumerable()
.Select(x => new {Date = x.date.ToString("M/d/yyyy")...)