LLBL cannot process sub queries in the from clause. however you can rewrite the query this way
select MyOrders.*
from MyOrders
where MyOrders.StateId = @State
MyOrders.OrderDate = (
select max(o.OrderDate)
from MyOrders o
where o.StateId = @state
group by o.CustomerId
)
You can use the FieldSetPredicate to construct the sub select where clause. it would look something like this
EntityCollection<MyOrders> listOfOrders = new EntityCollection<MyOrders>();
IGroupingCollection grouping = new GroupingCollection();
grouping.Add(MyOrdersFields.CustomerId.SetObjectAlias("foo"))
IPredicateExpression predicate = new FieldSetPredicate(
MyOrdersFields.OrderDate, null,
MyOrdersFields.OrderDate.SetAggregate(Aggregate.Max).SetObjectAlias("foo"), null,
SetOperator.Equals,
MyOrdersFields.StateId.SetObjectAlias("foo") == "PA",
null, null,
grouping
);
IRelationPredicateBucket bucket = new RelationPredicateBucket();
bucket.PredicateExpression.Add(MyOrdersFields.StateId == "PA");
bucket.PredicateExpression.Add(predicate);
using (IDataAccessAdapter adapter = new DataAccessAdapter())
{
adapter.FetchEntityCollection(listOfOrders, bucket);
}
return listOfOrders;
i'm sure there is a problem somewhere in the code. It's off the top of my head, but it gets you started.
you could also write it this way.
EntityCollection<CustomerEntity> listOfCustomers = new EntityCollection<CustomerEntity>();
IPrefetchPath2 prefetch = new PrefetchPath2((int)EntityType.Customer);
prefetch.Add(CustomerEntity.PrefetchMyOrders, 1, new SortExpression(MyOrdersFields.OrderDate | SortOperator.Descending));
IRelationPredicateBucket bucket = new RelationPredicateBucket();
bucket.PredicateExpression.Add(CustomerFields.StateId == "PA");
bucket.Relations.Add(CustomerEntity.Relations.MyOrdersViaCustomerId);
using (IDataAccessAdapter adapter = new DataAccessAdapter())
{
adapter.FetchEntityCollection(listOfCustomers, bucket, prefetch);
}
EntityCollection<MyOrdersEntity> listOfOrders = new EntityCollection<MyOrdersEntity>();
foreach(CustomerEntity customer in listOfCustomers)
{
listOfOrders.Add(customer.MyOrders[0]);
}
return listOfOrders;