NHibernate에서 반환 된 IQueryable에 LINQ를 사용하고 있으며 두 필드에서 최대 값을 가진 행을 선택해야합니다.
내가 고수하는 부분을 단순화했습니다. 한 필드에서 최대 값을 사용하여 테이블에서 한 행을 선택해야합니다.
var table = new Table { new Row(id: 1, status: 10), new Row(id: 2, status: 20) }
from u in table
group u by 1 into g
where u.Status == g.Max(u => u.Status)
select u
이것은 부정확하지만 올바른 형식을 찾을 수 없습니다.
BTW, 내가 실제로 달성하려는 것은 대략 다음과 같습니다.
var clientAddress = this.repository.GetAll()
.GroupBy(a => a)
.SelectMany(
g =>
g.Where(
a =>
a.Reference == clientReference &&
a.Status == ClientStatus.Live &&
a.AddressReference == g.Max(x => x.AddressReference) &&
a.StartDate == g.Max(x => x.StartDate)))
.SingleOrDefault();
위의 람다로 시작했지만 LINQPad를 사용하여 Max ()를 선택하는 구문을 시도하고 해결했습니다.
최신 정보
GroupBy 제거가 핵심이었습니다.
var all = this.repository.GetAll();
var address = all
.Where(
a =>
a.Reference == clientReference &&
a.Status == ClientStatus.Live &&
a.StartDate == all.Max(x => x.StartDate) &&
a.AddressReference == all.Max(x => x.AddressReference))
.SingleOrDefault();
답변
왜 여기에 그룹화하는지 모르겠습니다.
이 시도:
var maxValue = table.Max(x => x.Status)
var result = table.First(x => x.Status == maxValue);
한 table
번만 반복되는 다른 접근 방식 은 다음과 같습니다.
var result = table.OrderByDescending(x => x.Status).First();
경우에 유용 table
인 IEnumerable<T>
메모리에 존재하지 않은 것 또는이 실시간으로 계산된다.
답변
다음을 수행 할 수도 있습니다.
(from u in table
orderby u.Status descending
select u).Take(1);
답변
상태별로 그룹화하고 가장 큰 그룹에서 행을 선택할 수 있습니다.
table.GroupBy(r => r.Status).OrderByDescending(g => g.Key).First().First();
첫 First()
번째 그룹은 첫 번째 그룹 (상태가 가장 큰 행 집합)을 가져옵니다. 두 번째 First()
는 해당 그룹의 첫 번째 행을 가져옵니다.
상태가 항상 unqiue이면 두 번째 First()
를 Single()
.
답변
첫 번째 질문을 해결하면서 특정 기준에 따라 그룹화 된 여러 행을 최대 값을 가진 다른 열과 함께 가져와야하는 경우 다음과 같이 할 수 있습니다.
var query =
from u1 in table
join u2 in (
from u in table
group u by u.GroupId into g
select new { GroupId = g.Key, MaxStatus = g.Max(x => x.Status) }
) on new { u1.GroupId, u1.Status } equals new { u2.GroupId, Status = u2.MaxStatus}
select u1;
답변
더 많은 예 :
따르다:
qryAux = (from q in qryAux where
q.OrdSeq == (from pp in Sessao.Query<NameTable>() where pp.FieldPk
== q.FieldPk select pp.OrdSeq).Max() select q);
같음 :
select t.* from nametable t where t.OrdSeq =
(select max(t2.OrdSeq) from nametable t2 where t2.FieldPk= t.FieldPk)
답변
한 줄로 간단히 :
var result = table.First(x => x.Status == table.Max(y => y.Status));
두 가지 조치가 있습니다. 내부 동작은 최대 값을 찾는 것이고 외부 동작은 원하는 객체를 얻기위한 것입니다.
답변
