linq DataService Query中的日期字段比较

时间:2014-03-21 15:24:28

标签: c# linq wcf-data-services

我有一个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)
                  );

如何将我的日期时间列与输入的文本进行比较?

2 个答案:

答案 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

              );