C# Linq筛选日期的一部分

C# Linq筛选日期的一部分,c#,entity-framework,linq,C#,Entity Framework,Linq,我有一个输入和一个数据表,当用户键入该输入时,我根据用户键入的内容过滤KeyUp上的数据。就像datatables.net一样,但它是从零开始学习的 datatable有3列fullname(字符串)、city(字符串)和dateofbirth(datetime) 我想如果用户输入例如:“2/”它会给他所有的DOB,其中有2/。到目前为止,这是我的代码(我尝试了很多次,但都没有成功) //Split()删除时间部分 以及: 但两者都给了我一个例外:“方法System.DateTime.ToStr

我有一个输入和一个数据表,当用户键入该输入时,我根据用户键入的内容过滤KeyUp上的数据。就像datatables.net一样,但它是从零开始学习的

datatable有3列fullname(字符串)、city(字符串)和dateofbirth(datetime)

我想如果用户输入例如:“2/”它会给他所有的DOB,其中有2/。到目前为止,这是我的代码(我尝试了很多次,但都没有成功)

//Split()删除时间部分

以及:


但两者都给了我一个例外:“方法System.DateTime.ToString的翻译”失败了

您可以使用类似于的语句,它将接近您想要的结果

var data = _context.Person.Where(p => EF.Functions.Like(p.DateOfBirth, $"%{searchquery}%")).ToList();
void SearchQuery_KeyUp(object sender, KeyEventArgs e)
{
     var data = _data.Where(p => p.DateOfBirth.Value
                   .ToString("d").Split()[0].Contains(SearchQuery)).ToList();
     Display(data);
}

问题在于,如果将日期保存为
DateTime
DateTime2
DateTimeOffset
字段,则它们在数据库中的表示形式将不同于您输入的字符串表示形式。i、 e.它们可能没有“/”(虽然这是不可能的,因为您没有提到您的数据库技术)。

如果您首先通过调用eg
context.person.ToList()
将表加载到内存中,您的方法应该可以工作,并且应该能够将
DateTime
转换为
字符串

我建议如下:

_context.Person.ToList().Where(p => p.DateOfBirth.Value
                           .ToString("dd/MM/yyyy").Contains(SearchQuery)).ToList();

当您使用LINQ to实体时,您的C#代码实际上不会执行。它被解析了。运行时将把C#代码解析为表达式,并将每个符号转换为SQL字符串的某个部分。然后,它将该字符串发送到要在服务器上执行的数据库。服务器不支持相同类型的日期格式,因此不支持方法调用表达式;无法将其转换为SQL字符串

然而,这里更大的问题是,您不应该每次击键都击中数据库;那会引起问题的

相反,在加载表单时,只需点击数据库一次。将列表缓存在内存中。您可以通过调用
ToList
来执行此操作。将结果存储在成员变量中

List<Person> _data;

void Form_Load(object sender, EventArgs e)
{
    _data = _context.Person.ToList();
}

你能告诉我们
Person
的定义吗?如果
DateOfBirth
是一个datetime用法
.Day
类Person{public long Id{get;set;}public string Fullname{get;set;}public datetime?DateOfBirth{get;set;}Ooof。。我怀疑这会很顺利。我认为您应该改进您的需求,而不是尝试编写代码。。如果用户键入
2/
并希望返回2002/11/31、2010/12/31、2000/2/11等生日,并且希望在每次按键时都返回这些日期。。。Ugh@Charlieface但是,如果用户继续键入“2/02/”会怎么样,因为我喜欢在用户键入时显示数据。
List<Person> _data;

void Form_Load(object sender, EventArgs e)
{
    _data = _context.Person.ToList();
}
void SearchQuery_KeyUp(object sender, KeyEventArgs e)
{
     var data = _data.Where(p => p.DateOfBirth.Value
                   .ToString("d").Split()[0].Contains(SearchQuery)).ToList();
     Display(data);
}