【问题标题】:Linq to EF Expression Tree / Predicate int.Parse workaroundLinq to EF 表达式树/谓词 int.Parse 解决方法
【发布时间】:2009-09-30 15:25:46
【问题描述】:

我有一个名为 Enquiry 的 linq 实体,它有一个属性:字符串 DateSubmitted。

我正在编写一个应用程序,我需要返回 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 to EF 无法识别 int.Parse,所以我想我可以使用返回谓词的 Expression 方法来实现我想要的???

我一直在玩 PredicateBuilder 并四处寻找,但我已经成功地绞尽脑汁试图解决这个问题。当然我可以向我的实体添加另一个属性并在那里转换它,但我真的很想了解这一点。任何人都可以解释或给出一个不会让我大吃一惊的例子/链接吗?

提前致谢

标记

【问题讨论】:

    标签: linq linq-to-entities expression-trees predicate


    【解决方案1】:

    如果您知道您的日期字符串是有效的,并且它们确实按照那个顺序(这是一种自然的排序顺序),您也许可以避免字符串比较:

    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);
    

    【讨论】:

    • 这是一个很好的解决方法,谢谢,我可能会使用它,谢谢!!!据我所知,有没有办法与谓词进行这种比较?我正在慢慢解决这个问题:-)
    • 嗯,你是从一个谓词开始的。我不确定我是否真的理解这个问题......
    • Jon 我想我正在寻找一种更通用的方法来在需要类型转换时比较值。我遇到了实体属性作为枚举公开的情况,并且需要将字符串与 int 进行比较。我认为通过查看 PredicateBuilder,我可能能够编写一组通用方法,例如可以执行小于或大于比较的操作,将输入类型转换为所需的类型。请原谅我缺乏知识,我了解 Linq 的基础知识,但我正在尝试了解扩展方法、表达式树和谓词。
    猜你喜欢
    • 2012-08-20
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多