LLBLGen Pro Build: 2.0.0.0 Final (August 3rd, 2006)
Runtime Version: 2.0.0.060808
Template Group/.NET Version: Adapter, 1 class, .NET 2.0
Database: SQL Server 2005
I have a question regarding a many to many prefetch scenario. I have a ServiceProviderEntity and a ServiceItemEntity, with a many-to-many relationship between the two, a ServiceProviderServiceItemEntity. My ServiceProviderServiceItemEntity has an IsActive boolean on it.
When I load a ServiceItemEntity for editing, I need to pre-fetch the following:
- ServiceProviderServiceItemEntity Collection (Active and Inactive)
- ServiceProviderEntity Collection (where ServiceProviderServiceItem.IsActive == true)
I have the following code:
ServiceItemEntity serviceItem = new ServiceItemEntity(serviceItemID);
IPrefetchPath2 itemPath = new PrefetchPath2((int)Data.Model.EntityType.ServiceItemEntity);
itemPath.Add(ServiceItemEntity.PrefetchPathServiceProviderServiceItem);
IPrefetchPathElement2 providerPath = itemPath.Add(ServiceItemEntity.PrefetchPathServiceProviderCollectionViaServiceProviderServiceItem);
providerPath.Filter.AddWithAnd(ServiceProviderServiceItemFields.IsActive == true);
providerPath.FilterRelations.Add(ServiceProviderEntity.Relations.ServiceProviderServiceItemEntityUsingServiceProviderID);
this.Adapter.FetchEntity(serviceItem, itemPath);
This works like a charm, but there's something about it that I don't like, which is adding to the FilterRelations. This is resulting in the ServiceProviderServiceItem table being joined in the SQL twice.
Here's the SQL that was executed (cleaned up for clarity):
SELECT DISTINCT
[MyDatabase].[dbo].[ServiceProvider].[ServiceProviderID]
-- All other ServiceProvider fields
, [MyDatabase].[dbo].[ServiceProvider].[IsActive]
FROM (
(
(
[MyDatabase].[dbo].[ServiceItem] [LPA__1]
INNER JOIN [MyDatabase].[dbo].[ServiceProviderServiceItem] [LPA_S2]
ON [LPA__1].[ServiceItemID] = [LPA_S2].[ServiceItemID]
)
INNER JOIN [MyDatabase].[dbo].[ServiceProvider]
ON [MyDatabase].[dbo].[ServiceProvider].[ServiceProviderID] = [LPA_S2].[ServiceProviderID]
)
INNER JOIN [MyDatabase].[dbo].[ServiceProviderServiceItem]
ON [MyDatabase].[dbo].[ServiceProvider].[ServiceProviderID] = [MyDatabase].[dbo].[ServiceProviderServiceItem].[ServiceProviderID]
)
WHERE (
( (( [LPA_S2].[ServiceItemID] = @ServiceItemID1))
AND ([MyDatabase].[dbo].[ServiceProviderServiceItem].[IsActive] = @IsActive2))
)
Without adding the FilterRelation, I get the following exception:
SD.LLBLGen.Pro.ORMSupportClasses.ORMQueryExecutionException was unhandled
Message="An exception was caught during the execution of a retrieval query: The multi-part identifier \"MyDatabase.dbo.ServiceProviderServiceItem.IsActive\" could not be bound.. Check InnerException, QueryExecuted and Parameters of this exception to examine the cause of this exception."
The query that was executed is:
SELECT DISTINCT
[MyDatabase].[dbo].[ServiceProvider].[ServiceProviderID]
-- All other ServiceProvider fields
, [MyDatabase].[dbo].[ServiceProvider].[IsActive]
FROM (
(
[MyDatabase].[dbo].[ServiceItem] [LPA__1]
INNER JOIN [MyDatabase].[dbo].[ServiceProviderServiceItem] [LPA_S2]
ON [LPA__1].[ServiceItemID] = [LPA_S2].[ServiceItemID]
)
INNER JOIN [MyDatabase].[dbo].[ServiceProvider]
ON [MyDatabase].[dbo].[ServiceProvider].[ServiceProviderID] = [LPA_S2].[ServiceProviderID]
)
WHERE (
( (( [LPA_S2].[ServiceItemID] = @ServiceItemID1))
AND ([MyDatabase].[dbo].[ServiceProviderServiceItem].[IsActive] = @IsActive2))
)
As you can see, the ServiceProvider.ServiceItem.IsActive filter fails, because ServiceProviderServiceItem is aliased when it's joined.
I'm still very, very new to LLBLGen, so I thought I should post this up here to see if I'm on the right track with adding the FilterRelation, or if there's a more efficient way of pulling this off.
Thanks,
Jeff