Hi,
I'm currently trying NHibernate.Linq and ran into a problem.
I tried to work with a Proxy for my classes and it failed with an
'Don't understand x.Name = "test"' exception.
After digging around I think I found the problem.
It seams to be in the handling of 'interface' properties within Linq.
I got a new test working (aka failing) for this issue and added a
possible implementation. Although, I'm not 100% sure if I did it
correctly (I really just spent one day on NHibernate.Linq and about 2
hours on the solution).
please find below the patch. I would be nice if someone could have a
look at it and, if useful, apply it.
Cheers,
Dominik
<<Patch starts below this line>>
-------------------------------------------------------------------------
Index: src/NHibernate.Linq/src/NHibernate.Linq/Visitors/
BinaryCriterionVisitor.cs
===================================================================
--- src/NHibernate.Linq/src/NHibernate.Linq/Visitors/
BinaryCriterionVisitor.cs (revision 651)
+++ src/NHibernate.Linq/src/NHibernate.Linq/Visitors/
BinaryCriterionVisitor.cs (working copy)
@@ -97,6 +97,13 @@
return expr;
}
+ protected override Expression
VisitMemberAccess(MemberExpression m)
+ {
+ Type = BinaryCriterionType.Property;
+ Name = m.Member.Name;
+ return m;
+ }
+
public static ICriterion GetBinaryCriteria(
ICriteria rootCriteria,
ISession session,
Index: src/NHibernate.Linq/src/NHibernate.Linq.Tests/Entities/User.cs
===================================================================
--- src/NHibernate.Linq/src/NHibernate.Linq.Tests/Entities/User.cs
(revision 651)
+++ src/NHibernate.Linq/src/NHibernate.Linq.Tests/Entities/User.cs
(working copy)
@@ -4,8 +4,21 @@
namespace NHibernate.Linq.Tests.Entities
{
- public class User
- {
+ public interface IUser
+ {
+ int Id { get; set; }
+ string Name { get; set; }
+ int InvalidLoginAttempts { get; set; }
+ DateTime RegisteredAt { get; set; }
+ DateTime? LastLoginDate { get; set; }
+ UserComponent Component { get; set; }
+ Role Role { get; set; }
+ EnumStoredAsString Enum1 { get; set; }
+ EnumStoredAsInt32 Enum2 { get; set; }
+ }
+
+ public class User : IUser
+ {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
@@ -33,6 +46,10 @@
}
}
+
+
+
+
public enum EnumStoredAsString { Unspecified, Small, Medium,
Large }
public enum EnumStoredAsInt32 { Unspecified, High, Low }
Index: src/NHibernate.Linq/src/NHibernate.Linq.Tests/Entities/
User.hbm.xml
===================================================================
--- src/NHibernate.Linq/src/NHibernate.Linq.Tests/Entities/
User.hbm.xml (revision 651)
+++ src/NHibernate.Linq/src/NHibernate.Linq.Tests/Entities/
User.hbm.xml (working copy)
@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="NHibernate.Linq.Tests.Entities"
assembly="NHibernate.Linq.Tests">
- <class name="User" table="Users">
+ <class name="User" table="Users"
+ proxy="IUser"
+ >
<id name="Id" column="UserId" type="Int32">
<generator class="native" />
</id>
Index: src/NHibernate.Linq/src/NHibernate.Linq.Tests/SelectionTests.cs
===================================================================
--- src/NHibernate.Linq/src/NHibernate.Linq.Tests/SelectionTests.cs
(revision 651)
+++ src/NHibernate.Linq/src/NHibernate.Linq.Tests/SelectionTests.cs
(working copy)
@@ -138,6 +138,18 @@
}
[Test]
+ public void CanSelectWithProxyInterface()
+ {
+ var query = from user in session.Linq<IUser>()
+ where user.Name == "ayende"
+ select user;
+
+ Assert.AreEqual(1, query.Count());
+ Assert.AreEqual("ayende", query.First().Name);
+
+ }
+
+ [Test]
public void CanSelectBinaryExpressions()
{
var query = from user in session.Linq<User>()
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"NHibernate Contrib - Development Group" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com.ar/group/nhcdevs?hl=en
-~----------~----~----~----~------~----~------~--~---