实体框架查询的Lambda表达式

时间:2009-12-29 21:15:13

标签: entity-framework lambda

我一直试图映射这个sql:

select dt.Id, dateadd(dd,datediff(dd,0,dt.CreatedAt),0) as Ct, DId, Amount
from dt, ad
where dt.ADId = ad.ADId and ad.Id = '13B29A01-8BF0-4EC9-80CA-089BA341E93D'
order by dateadd(dd,datediff(dd,0,dt.CreatedAt),0) desc, DId asc

进入与实体框架兼容的lambda查询表达式。我很感激任何帮助。

1 个答案:

答案 0 :(得分:1)

我觉得下面的代码应该有用。

Guid dtId = new Guid("13B29A01-8BF0-4EC9-80CA-089BA341E93D");
DateTime compareDt = new DateTime(...);

var q = from dt in dts
        where dt.id == dtId
        orderby dt.Ad.CreatedAt, Did
        select new
        {
            dt.Ad,
            (dt.CreatedAt - compareDt).Days,
            DId,
            Amount
        };

dtId必须在查询之外,因为实体框架映射器不理解带参数的构造函数,类似于DateTime。我无法完全找出dateiff / dateadd部分,看起来你正在确定自给定日期时间以来的总天数,这就是我所假设的。

可能是TimeSpan.Days之后的日期时间减法在查询中不起作用。如果是这种情况,请将其拉​​出来:

var q = from dt in dts
        where dt.id == dtId
        orderby dt.Ad.CreatedAt, Did
        select new
        {
            dt.Ad,
            dt.CreatedAt,
            DId,
            Amount
        };

这将创建一个具有DateTime CreatedAt属性的IEnumerable对象。如果现在调用.ToList(),则执行查询,并且可以计算Entity Framework不支持的内容。同样,如果第一次尝试有效,那么如果自X以来的天数是您所需的天数,那么这是最好的解决方案。

from item in q.ToList()
select new
{
    dt.Ad
    (dt.CreatedAt - compareDt).Days,
    DId,
    Amount
};