使用DateTime时LinQ中无Contains方法?SQL转LinQ日期查询求助
解决DateTime类型在LINQ中无Contains方法及SQL转LINQ的问题
为什么DateTime找不到Contains方法?
首先得理清楚:Contains是给集合类型(比如List<T>)判断元素是否存在,或者给字符串类型判断子串用的工具方法。而DateTime是值类型,本身并没有内置这个方法——你实际要实现的是SQL里LIKE '%日期%'的模糊匹配逻辑,本质上需要把日期转换为字符串后再做包含判断。
你的SQL对应的LINQ实现
原SQL语句:
SELECT * FROM [ReplicacionSigob].[dbo].[v_cbs01] where tramite_fecha_fin like '%2017-04-11%'
下面分两种常用场景给出具体实现:
1. 操作数据库(Entity Framework/LINQ to SQL)
如果是直接通过EF的DbContext操作数据库(比如dbContext.v_cbs01),有两种写法可选:
// 写法1:将日期转为指定格式字符串后用Contains var targetDateStr = "2017-04-11"; var results = dbContext.v_cbs01 .Where(item => item.tramite_fecha_fin.ToString("yyyy-MM-dd").Contains(targetDateStr)) .ToList(); // 写法2:EF Core推荐用EF.Functions.Like,更贴近原生SQL的LIKE逻辑 var results = dbContext.v_cbs01 .Where(item => EF.Functions.Like(item.tramite_fecha_fin.ToString("yyyy-MM-dd"), $"%{targetDateStr}%")) .ToList();
2. 操作内存中的集合(LINQ to Objects)
如果数据已经加载到本地内存(比如List<v_cbs01>),直接转换字符串判断即可:
var targetDateStr = "2017-04-11"; var results = yourInMemoryList .Where(item => item.tramite_fecha_fin.ToString("yyyy-MM-dd").Contains(targetDateStr)) .ToList();
额外注意事项
- 日期格式要统一:转字符串时必须指定明确格式(比如
yyyy-MM-dd),避免因系统默认日期格式差异导致匹配失败(比如4/11/2017和2017-04-11就无法匹配)。 - 性能优化建议:如果你的实际需求是匹配某一天的所有记录,别用模糊匹配!改用日期范围查询性能会好很多,还能利用数据库的日期索引:
var targetDate = new DateTime(2017, 4, 11); var results = dbContext.v_cbs01 .Where(item => item.tramite_fecha_fin >= targetDate && item.tramite_fecha_fin < targetDate.AddDays(1)) .ToList();
内容的提问来源于stack exchange,提问作者Jose Angel
相关产品推荐
相关产品推荐

