我有一个WCF数据服务,用于从具有Datetime列的表中获取客户记录。在我的UI中,我有一个显示Name和DOB的网格。我有一个用于过滤的文本框。当在过滤器中输入文本时,我希望将该文本与表中的所有列进行比较。将搜索文本与Datetime列进行比较时,我收到异常。这是我在下面使用的查询。
enter code here
db.Customers.Where(customer => customer.LastName.ToUpper().StartsWith(text) ||
customer.FirstNme.ToUpper().StartsWith(text) ||
(customer.DOB.Value.Year.ToString()
.StartsWith(text)
);
抛出异常'错误将linq表达式转换为URI'。
另一方面,如果我只是将Datetime字段与直接值进行比较,那就可以了。
enter code here
db.Customers.Where(customer => customer.LastName.ToUpper().StartsWith(text) ||
customer.FirstNme.ToUpper().StartsWith(text) ||
(customer.DOB.Value.Year == 1985)
);
如何将我的日期时间列与输入的文本进行比较?
答案 0 :(得分:0)
您可以将输入的文本转换为整数,并将第二个查询中的文字替换为:
int year;
if(!int.TryParse(text, out year)) year = -1;
var res = db.Customers.Where(customer =>
customer.LastName.ToUpper().StartsWith(text) ||
customer.FirstNme.ToUpper().StartsWith(text) ||
(customer.DOB.Value.Year == year)
);
通过在数据不是数字的情况下设置year = -1
,可以保证该特定日期字段中的任何内容都不匹配。
当然,这假设您只对与Year属性进行比较感兴趣。如果您需要比较完整的日期时间,您可以将输入的文本解析为DateTime,然后将其用于比较。
答案 1 :(得分:0)
我不确定是否有按照您尝试的顺序执行操作的具体原因,但我会尝试将您的字符串转换为日期时间,而不是尝试将日期时间转换为字符串。
DateTime dt = Convert.ToDateTime(string);
然后你可以比较:
db.Customers.Where(customer => customer.LastName.ToUpper().StartsWith(text) ||
customer.FirstNme.ToUpper().StartsWith(text) ||
(customer.DOB.Value.Year == dt.Year
);