Entity framework 实体框架查询的Lambda表达式

Entity framework 实体框架查询的Lambda表达式,entity-framework,lambda,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 转换为与实体框

我一直在尝试映射以下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查询表达式。我非常感谢你的帮助

我认为下面的代码应该可以工作

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。我无法完全理解datediff/dateadd部分,看起来您正在确定自给定datetime以来的总天数,这是我假设的

可能是datetime减法后跟
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(),查询将被执行,您可以计算实体框架不支持的内容。同样,如果第一次尝试成功,那么如果自X起的天数是您所需要的,那么这是最好的解决方案

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

我认为下面的代码应该可以工作

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。我无法完全理解datediff/dateadd部分,看起来您正在确定自给定datetime以来的总天数,这是我假设的

可能是datetime减法后跟
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(),查询将被执行,您可以计算实体框架不支持的内容。同样,如果第一次尝试成功,那么如果自X起的天数是您所需要的,那么这是最好的解决方案

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

ad是否具有指向dt的导航属性,反之亦然?是的,dt具有指向ad的FK属性,它是ad的PK(ad.ADId)。ad是否具有指向dt的导航属性,反之亦然?是的,dt具有指向ad的FK属性,它是ad的PK(ad.ADId)。1抱怨“不支持”?\1抱怨“不支持”?