Ok, I'm officially stumped, although I refuse to give up.
Here's what I want to do:
Select
g.GroupID,
g.GroupName,
ugdp.Value,
ugdp.Date,
up.FullName,
... < more fields > ...
From [Group] g
inner join UserProfile up ON up.UserID = @UserID -- for argument's sake
inner join user_group_dp ugdp ON ugdp.UserID = up.UserID AND ugdp.GroupID = g.Groupid
AND ugdp.MiscPK1 = @SomePK1 AND ugdp.MiscFK2 = @SomeFK2
The part I'm really having trouble with is:
AND ugdp.GroupID = g.Groupid
The dynamic list I have built up in code looks primarily like this:
fields.DefineField(GroupFieldIndex.GroupNm, fields.Count - 1, "RegionNm", "Region");
fields.Expand(1);
fields.DefineField(GroupFieldIndex.GroupNm, fields.Count - 1, "MarketNm", "Market");
fields.Expand(1);
fields.DefineField(UserProfileFieldIndex.UniqueID, fields.Count - 1, "ID");
fields.Expand(1);
fields.DefineField(GroupFieldIndex.UniqueID, fields.Count - 1, "RetailerID");
fields.Expand(1);
fields.DefineField(GroupFieldIndex.GroupID, fields.Count -1, "GroupID");
fields.Expand(1);
fields.DefineField(GroupFieldIndex.GroupNm, fields.Count - 1, "RetailerNm");
fields.Expand(1);
fields.DefineField(UserProfileFieldIndex.FirstName, fields.Count - 1, "FirstName");
fields.Expand(1);
fields.DefineField(UserProfileFieldIndex.LastName, fields.Count - 1, "LastName");
bucket.Relations.Add(GroupEntity.Relations.GroupEntityUsingGroupIDParentGroupID, string.Empty, "Market", JoinHint.None);
bucket.Relations.Add(GroupEntity.Relations.GroupEntityUsingGroupIDParentGroupID, "Market", "Region", JoinHint.None);
bucket.Relations.Add(GroupEntity.Relations.GroupEntityUsingGroupIDParentGroupID, "Region", "Country", JoinHint.None);
... < Add UserProfile Relation > ...
... < This next part is done in a loop as there could be multiple > ...
fields.Expand(1);
string suffix = index.ToString();
IPredicateExpression exp = new PredicateExpression();
exp.AddWithAnd(PredicateFactory.CompareValue(User_Group_DataPointFieldIndex.GroupID, ComparisonOperator.Equal, null, "GroupID"));
exp.AddWithAnd(PredicateFactory.CompareValue(User_Group_DataPointFieldIndex.DataPointID, ComparisonOperator.Equal, dataPoint.DataPointID,"CurrentValue" + suffix));
exp.AddWithAnd(PredicateFactory.CompareValue(User_Group_DataPointFieldIndex.CalendarYearID, ComparisonOperator.Equal, Convert.ToInt32(years[j].ToString()),"CurrentValue" + suffix));
exp.AddWithAnd(PredicateFactory.CompareValue(User_Group_DataPointFieldIndex.TimeFrameID, ComparisonOperator.Equal, timeFrameID,"CurrentValue" + suffix));
bucket.Relations.Add(UserProfileEntity.Relations.User_Group_DataPointEntityUsingUserID, string.Empty, "CurrentValue" + suffix, JoinHint.Left).CustomFilter = exp;
One thing to note is this is meant to be polymorphic. Multiple things use this particular method in different ways.
I've written this about 20 different ways and with one exception in the example above, if I try to alias my starting table [Group] with "Group", I consistantly get this error:
"Relation at index 3 doesn't contain an entity already added to the FROM clause. Bad alias?".
So in actuality, if I take out:
exp.AddWithAnd(PredicateFactory.CompareValue(User_Group_DataPointFieldIndex.GroupID, ComparisonOperator.Equal, null, "GroupID"));
Everything works, but my relation that I'm adding is too broad and needs the GroupID (which is one of the PK's).
I apologize if I don't make much sense. I'll try to clean the post up in a few minutes or so.