Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql LINQ中的where子句子查询_Sql_Linq_Linq To Sql - Fatal编程技术网

Sql LINQ中的where子句子查询

Sql LINQ中的where子句子查询,sql,linq,linq-to-sql,Sql,Linq,Linq To Sql,我正在尝试将SQL语法转换为LINQ查询,但子查询有问题。 我想选择表中Id为的最大日期时间作为另一个select命令的子查询,但我不知道下面的代码有什么对或错。 我在Sql中拥有什么 select ap.* ,aph.Lat as 'personLat',aph.Lng as 'personLng',l.cityId,l.Lat as 'LifecenterLat',l.lng as 'LifecenterLng',l.Id as 'LifeCenterId' from Applicant

我正在尝试将SQL语法转换为LINQ查询,但子查询有问题。 我想选择表中Id为的最大日期时间作为另一个select命令的子查询,但我不知道下面的代码有什么对或错。 我在Sql中拥有什么

select ap.* ,aph.Lat as 'personLat',aph.Lng as 'personLng',l.cityId,l.Lat as 'LifecenterLat',l.lng as 'LifecenterLng',l.Id as 'LifeCenterId' 
from Applicant ap
inner join ApplicantAddressHistory aph on ap.Id = aph.ApplicantId 
inner join LifePlusCenter l on aph.CityId = l.CityId 
Where ap.FamilyRoleTypeId = '82e26080-fda6-4396-946c-40d0e267f1f3'  and aph.CreatedDate in (select max(CreatedDate) from ApplicantAddressHistory
where ApplicantAddressHistory.ApplicantId = ap.Id)
order by ap.NationalityCode
还有我在林克的尝试

        var innerJoinMultipleTables = from app in db.Applicant.Where(x => x.FamilyRoleTypeId == Guid.Parse("82e26080-fda6-4396-946c-40d0e267f1f3"))
                                          join aph in db.ApplicantAddressHistory on app.Id equals aph.ApplicantId         
                                          where aph.CreatedDate == db.ApplicantAddressHistory.Max(x => x.CreatedDate && x.Id=aph.Id)
                                          join l in db.LifePlusCenter on aph.CityId equals l.CityId
                                          let centerLat = l.Lat
                                          let centerLng = l.Lng
                                          orderby app.NationalityCode
                                          select new { app, aph.Lat, aph.Lng, l.CityId, l.Branch, centerLat, centerLng };
没有下面这行代码,我的linq工作正常

  where aph.CreatedDate == db.ApplicantAddressHistory.Max(x => x.CreatedDate && x.Id=aph.Id)

我需要像下面这样的代码在Linq中作为子查询

select max(CreatedDate) from ApplicantAddressHistory where ApplicantAddressHistory.ApplicantId = '9836CEC4-EDCB-492C-9899-DF4279210CD2'

我终于尝试了这个,它工作,但不知道它的正确方式与否

           var innerJoinMultipleTables = from app in db.Applicant.Where(x => x.FamilyRoleTypeId == Guid.Parse("82e26080-fda6-4396-946c-40d0e267f1f3"))
                                          join aph in db.ApplicantAddressHistory on app.Id equals aph.ApplicantId
                                          let rept_max = (from c in db.ApplicantAddressHistory
                                                          where c.Id == app.Id
                                                          select c.CreatedDate).Max()

                                          where aph.CreatedDate == rept_max
                                          join l in db.LifePlusCenter on aph.CityId equals l.CityId


                                          let centerLat = l.Lat
                                          let centerLng = l.Lng
                                          orderby app.NationalityCode
                                          select new { app, aph.Lat, aph.Lng, l.CityId, l.Branch, centerLat, centerLng };

我不确定它在Linq中是如何工作的,但是您可以像下面这样修改您的查询,以根据每个applicationId的CreatedDate获得最新的详细信息

select ap.* ,aph.Lat as 'personLat',aph.Lng as 'personLng',l.cityId,l.Lat as 'LifecenterLat',l.lng as 'LifecenterLng',l.Id as 'LifeCenterId' 
from Applicant ap
inner join 
    (select *
    from
    (select *,row_number() over(partition by ApplicantId order by CreatedDate desc) rw
    from ApplicantAddressHistory
    ) p
    where p.rw=1
    ) aph 
    on ap.Id = aph.ApplicantId 
inner join LifePlusCenter l 
    on aph.CityId = l.CityId 
Where ap.FamilyRoleTypeId = '82e26080-fda6-4396-946c-40d0e267f1f3'  
/*
and aph.CreatedDate in (
select max(CreatedDate) from ApplicantAddressHistory
where ApplicantAddressHistory.ApplicantId = ap.Id
)
*/
order by ap.NationalityCode
最后我想到:

            var z = from app in db.Applicant
                    join aph in db.ApplicantAddressHistory on app.Id equals aph.ApplicantId
                    join l in db.LifePlusCenter on aph.CityId equals l.CityId

                    let createDate = app.ApplicantAddressHistory.Max(c => c.CreatedDate)

                    where createDate.HasValue && aph.CreatedDate == createDate

                    && app.FamilyRoleTypeId == Guid.Parse("82e26080-fda6-4396-946c-40d0e267f1f3")
                    let personLat = aph.Lat
                    let personLng = aph.Lng
                    let centerId = l.Id
                    let LifecenterLat = l.Lat
                    let LifecenterLng = l.Lng
                    orderby app.NationalityCode
                    select new { app, aph, l, app.Id, l.CityId, centerId, personLat, personLng, LifecenterLat, LifecenterLng };

我在SQL中没有遇到任何问题,但在linqI中有一个关于LINQ查询的问题:语句所在的子查询是否使用了正确的
applicationAddressHistory
列来获取最长日期?我认为这应该是正确的:
其中c.applicationId==app.Id