Вот ещё такой тест:
[MapField("DbId", "Id")]
[MapField("DbParentid", "Parent.Id")]
public class TreeNode
{
public Int32 Id { get; set; }
public TreeNode Parent { get; set; }
}
[Test(Description = "BLT BUG")]
public void TreeIssueTest()
{
using (var db = new DbManager())
{
var q1 = db.GetTable<TreeNode>();
var q = q1.Where(_ => _.Parent.Id == 5);
var sql = ((Table<TreeNode>)q).SqlText;
Assert.IsNotEmpty(sql);
var wherePos = sql.IndexOf("WHERE");
Assert.AreNotEqual(-1, sql.IndexOf("DbParentid", wherePos));
}
}
Выборка из базы идёт здесь не по DbParentid, а по DbId.
Покопавшись, мы решили проблему, навесив атрибут на св-во Parent:
[Association(OtherKey = "Id", ThisKey = "Parent.Id", CanBeNull = false)]
В случае, когда атрибут MapField для Parent.Id задан явно, я считаю такую генерацию запросов неожиданным поведением.
Добавлю ещё, что JOIN, который генерируется этой ассоциацией в данном тестовом примере оптимизируется, но у нас это не всегда происходит.
К сожалению, не могу пока повторить это поведение в тестах.