I am trying to use Jetdriver and new version of Linq, but it is not
working. I made a test below using the Foo class of Jetdriver unit
tests to make some queries with strings. I think LINQ driver of has
some problems and is not finished, but I think these queries work with
SQL Server driver.
The new LINQ create some SQL queries like the examples below that do
not work with Access.
LINQ
s.Query<Foo>().Where(f => f.Module == "bar");
SQL
NHibernate: select foo0_.ModuleId as ModuleId4_, foo0_.`Module` as
Module2_4_, foo0_.ModuleValue as ModuleVa3_4_, foo0_.ShortName as
ShortName4_, foo0_.LongName as LongName4_, foo0_.Description as
Descript6_4_ from Foo foo0_ where (foo0_.`Module` is null) and (? is
null) or foo0_.`Module`=?;@p0 = 'bar' [Type: String (3)]
LINQ
var q = s.Query<Foo>().Where(f => f.Module.Contains("a"));
SQL
NHibernate: select foo0_.ModuleId as ModuleId4_, foo0_.`Module` as
Module2_4_, foo0_.ModuleValue as ModuleVa3_4_, foo0_.ShortName as
ShortName4_, foo0_.LongName as LongName4_, foo0_.Description as
Descript6_4_ from Foo foo0_ where foo0_.`Module` like
('%'||?||'%');@p0 = 'a' [Type: String (1)]
I made some workarounds , force true to UseNamedPrefixInSql to use
named parameters instead of "?" in the JetDriver class and register
some functions in JetDialect class
RegisterFunction("concat", new
VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")"));
RegisterFunction("length", new StandardSQLFunction("len",
NHibernateUtil.Int32));
RegisterFunction("substring", new
SQLFunctionTemplate(NHibernateUtil.String, "mid(?1, ?2+1, ?3)"));
RegisterFunction("locate", new
SQLFunctionTemplate(NHibernateUtil.Int32, "(instr(?3+1,?2,?1)-1)"));
[Test]
public void can_execute_string_functions()
{
object savedId;
using (var s = SessionFactory.OpenSession())
{
using (var t = s.BeginTransaction())
{
savedId = s.Save(new Foo
{
ModuleId = -1,
Module = "bar"
});
t.Commit();
}
using (var t = s.BeginTransaction())
{
var q = s.Query<Foo>().Where(f => f.Module ==
"bar");
var list = q.ToList();
q = s.Query<Foo>().Where(f => f.Module.Length>1);
list = q.ToList();
q = s.Query<Foo>().Where(f =>
f.Module.StartsWith("b"));
list = q.ToList();
q = s.Query<Foo>().Where(f =>
f.Module.EndsWith("r"));
list = q.ToList();
q = s.Query<Foo>().Where(f =>
f.Module.Contains("a"));
list = q.ToList();
q = s.Query<Foo>().Where(f =>
f.Module.ToUpper()=="BAR");
list = q.ToList();
q = s.Query<Foo>().Where(f => f.Module.ToLower()
== "bar");
list = q.ToList();
q = s.Query<Foo>().Where(f =>
f.Module.Substring(1, 1) == "bar".Substring(1, 1));
list = q.ToList();
q = s.Query<Foo>().Where(f =>
f.Module.IndexOf("r") == "bar".IndexOf("r"));
list = q.ToList();
q = s.Query<Foo>().Where(f => f.Module==null);
list = q.ToList();
q = s.Query<Foo>().Where(f => null==f.Module);
list = q.ToList();
t.Commit();
}
}
--
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/group/nhcdevs?hl=en.