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
-~----------~----~----~----~------~----~------~--~---

Reply via email to