我有两个日期时间选择器,我用它来设置数据库中所需记录的开始和结束日期。数据库中的“日期”以yyyymmdd
格式存储为字符串,但某些日期缺少字符(例如2001094,缺少当天的最后一位数字)。
我想写一个LINQ查询来拉取相关时间跨度的记录,但是如果我这样做的话:
var =
from rec in datacontext
where rec.date.substring(0,8) is in the daterange
select rec
然后我超出了短弦记录的范围异常(因为它们不是8个字符长)。
现在我正在拉入整个表并使用两个lambdas来(1)删除所有不以8个整数开头的记录然后(2)删除所有现在的.substring-safe记录不符合范围。这有效,但它真的很难看。
如果我的where子句中有两个条件,LINQ会按顺序对它们进行评估吗?所以,如果我说
from ... where (rec.date starts with 8 integers) AND (rec.date is in range)
当LINQ看到它们与第一个条件不匹配时,它会跳过记录吗?
我能想到的另一件事(也有点丑陋)是在初始LINQ查询中使用.StartsWith
而不是.SubString
,然后在初始查询后使用lambdas删除范围记录。这比拉入我现在正在做的所有行更好,但不是我正在寻找的优雅单一查询。
if datetimepickers are both in the same year...
var=from ... where rec.date.startswith(yyyy) 'at least I'm not pulling in everything...
var.remove(lambda to remove short date strings)
var.remove(lambda to remove out of range dates)
答案 0 :(得分:2)
在这种情况下,添加对字符串长度的检查将解决问题。在这种情况下,LINQ将评估AND条件的第一部分,然后停止评估它是否失败。所以,如果它有A&& B,如果A为假,则不会评估B
var=from rec in datacontext where rec.date.length >= 8 && rec.date.substring(0,8) is in the daterange select rec