2009-09-30 24 views
1

我有一个linq实体调用Inquiry,它有一个属性:string DateSubmitted。Linq到EF表达式树/谓词int.Parse解决方法

我正在写一个应用程序,我需要返回IQueryable查询有一个DateSubmitted在一个特定的日期范围内。

理想我想写点东西像

IQueryable<Enquiry> query = Context.EnquirySet.AsQueryable<Enquiry>(); 
int dateStart = int.Parse("20090729"); 
int dateEnd = int.Parse("20090930"); 

query = (from e in query 
    where(enq => int.Parse(enq.DateSubmitted) < dateEnd) 
    where(enq => int.Parse(enq.DateSubmitted) > dateStart) 
    select e); 

显然LINQ到EF不承认int.Parse,所以我想我可以实现我想返回谓词的表达方法? ??

我一直在使用PredicateBuilder玩,并且遍地看,但我已经成功地炒我的大脑,试图解决这个问题。当然,我可以添加另一个属性到我的实体并将其转换,但我真的很想了解这一点。任何人都可以解释或给出一个不会让我大脑绞痛的例子/链接吗?

在此先感谢

马克

回答

3

如果你知道你的日期字符串是有效的,而且他们真正的顺序(这是一个自然的排序顺序),你也许可以用绳子逃脱比较:

IQueryable<Enquiry> query = Context.EnquirySet.AsQueryable<Enquiry>(); 
string dateStart ="20090729"; 
string dateEnd = "20090930"; 

query = (from e in query 
    where(enq => enq.DateSubmitted.CompareTo(dateEnd)) < 0) 
    where(enq => enq.DateSubmitted.CompareTo(dateStart)) > 0) 
    select e); 
+0

这是一个很好的解决方法,谢谢我可能会使用它,谢谢! 据我所知,有没有一种方法与Predicate做这种比较?我正在慢慢把我的脑袋弄到这个地方:-) – Mark 2009-09-30 15:36:53

+0

那么你是用一个谓词来开始吧。我不知道我真的明白这个问题... – 2009-09-30 15:51:14

+0

乔恩 我想我正在寻找一种更通用的方式,可以在需要类型转换时比较值。我有情况下的实体属性暴露为枚举和字符串需要与int进行比较。 我认为从看PredicateBuilder我可能会写一个通用的一组方法,例如可以做一个小于或大于比较将输入类型转换为所需的类型。 请原谅我缺乏知识,我理解Linq的基本知识,但我试图让我的头围绕扩展方法,Expresison树和Predicates。 – Mark 2009-10-01 07:44:50