C# 使用基于条件的Linq搜索日期中的月份或年份

C# 使用基于条件的Linq搜索日期中的月份或年份,c#,.net,linq,datatable,where-clause,C#,.net,Linq,Datatable,Where Clause,我想先解释一下我的情况: 我有一个DataTable,它显示在DataGridView中。我还有一个文本框,用于搜索特定列中的值。对于日期值,如下所示(searchInDt是我的数据表,getSelectedItem是列名,searchBox是文本框) searchInDt.CaseSensitive=false; var rowSources=(来自searchInDt中的myRow) .可计算的() .Where(myRow=>myRow.Field(getSelectedItem) .To

我想先解释一下我的情况:

我有一个
DataTable
,它显示在
DataGridView
中。我还有一个
文本框
,用于搜索特定列中的值。对于日期值,如下所示(searchInDt是我的数据表,getSelectedItem是列名,searchBox是文本框)

searchInDt.CaseSensitive=false;
var rowSources=(来自searchInDt中的myRow)
.可计算的()
.Where(myRow=>myRow.Field(getSelectedItem)
.ToString()
.StartsWith(searchBox.Text))
选择myRow);
if(rowSources.Any())
dataGridView1.DataSource=rowSources.CopyToDataTable();
这是可行的,但现在我有了一个
复选框
,可以在月份和年份之间进行选择。如果我想从
DateTime
值的第3位(月份)或第6位(年份)进行搜索,它是如何工作的?

我试过跳过,但这不起作用。即使尝试使用
EndsWith
(这与我正在寻找的不完全一样)也不起作用。

您可以直接检查
日期时间
字段的
/
属性,而不是检查
日期时间
字符串

根据复选框选择设置
isMonth
的值,然后

var isMonth = <true if Month is selected, false if Yaer is selected>;
var query = int.Parse(searchBox.Text);
var rowSources = searchInDt.AsEnumerable()
                           .Where(row => isMonth ? row.Field<DateTime>(getSelectedItem).Month == query
                                                 : row.Field<DateTime>(getSelectedItem).Year == query);
var isMonth=;
var query=int.Parse(searchBox.Text);
var rowSources=searchInDt.AsEnumerable()
.Where(row=>isMonth?row.Field(getSelectedItem).Month==query
:row.Field(getSelectedItem.Year==查询);

另一方面,您应该使用
单选按钮
,因为通常使用
复选框
s来选择多个值,并且您不希望用户同时选择月份和年份

您可以直接检查
日期时间
字段的
/
属性,而不必检查
字符串

根据复选框选择设置
isMonth
的值,然后

var isMonth = <true if Month is selected, false if Yaer is selected>;
var query = int.Parse(searchBox.Text);
var rowSources = searchInDt.AsEnumerable()
                           .Where(row => isMonth ? row.Field<DateTime>(getSelectedItem).Month == query
                                                 : row.Field<DateTime>(getSelectedItem).Year == query);
var isMonth=;
var query=int.Parse(searchBox.Text);
var rowSources=searchInDt.AsEnumerable()
.Where(row=>isMonth?row.Field(getSelectedItem).Month==query
:row.Field(getSelectedItem.Year==查询);

另一方面,您应该使用
单选按钮
,因为通常使用
复选框
s来选择多个值,并且您不希望用户同时选择月份和年份

不知道一个人可以搜索几个月甚至几年。谢谢你!但不知何故,这对我来说并不管用(就像EndsWith一样)。if语句不包含任何结果(if(rowSources.any()),请首先检查这是否是数据问题。确定。我用等号试过了,知道了,效果很好。有没有机会在StartsWith(本月)上这样做?谢谢你的解决方案!我不建议这样做
StartsWith
是一种
string
方法,不能与
DateTime
一起使用。要使用
StartsWith
,您需要先使用
.ToString()
将日期转换为字符串,但这样会失去类型安全性,使代码容易出错。如果你真的想这样做,你可以做一些像
dateValue.ToString(“MMddyyyy”).StartsWith(monthSearchString)
。不知道可以搜索几个月和几年。谢谢你!但不知何故,这对我来说并不管用(就像EndsWith一样)。if语句不包含任何结果(if(rowSources.any()),请首先检查这是否是数据问题。确定。我用等号试过了,知道了,效果很好。有没有机会在StartsWith(本月)上这样做?谢谢你的解决方案!我不建议这样做
StartsWith
是一种
string
方法,不能与
DateTime
一起使用。要使用
StartsWith
,您需要先使用
.ToString()
将日期转换为字符串,但这样会失去类型安全性,使代码容易出错。如果您真的想这样做,可以执行类似于
dateValue.ToString(“MMddyyyy”).StartsWith(monthSearchString)
的操作。