次のような場合にSQL2008が期待するのNHibernateによって生成されたSQLおよびSQL betweeen不一致があるように表示されます。LinqがContainsとSubStringでNhibernateに動作しませんか?
public void PersistPerson()
{
var sessionFactory = CreateSessionFactory();
using (var session = sessionFactory.OpenSession())
{
using(var transaction = session.BeginTransaction())
{
session.Save(new Person {FirstName = "Foo", LastName = "Bar"});
session.Save(new Person {FirstName = "Foo", LastName = "Dah"});
session.Save(new Person {FirstName = "Foo", LastName = "Wah"});
transaction.Commit();
}
}
using (var session = sessionFactory.OpenSession())
{
using(var transaction = session.BeginTransaction())
{
var queryable = from p in session.Query<Person>() select p;
var lastNames = new[]{"B", "D"};
var result = queryable.Where(r => lastNames.Contains(r.LastName.Substring(0, 1))).ToList();
transaction.Commit();
Assert.That(result[0].LastName, Is.EqualTo("Bar"));
}
}
}
var result = queryable.Where(r => lastNames.Contains(r.LastName.Substring(0, 1))).ToList();
ためのNHibernateによって生成されたSQLクエリは次のとおりです。
select person0_.Id as Id0_,
person0_.FirstName as FirstName0_,
person0_.LastName as LastName0_ from [Person] person0_ where upper(substring(person0_.LastName,
0 /* @p0 */,
1 /* @p1 */)) in ('B' /* @p2 */)
T-SQLサブテーブルのMSDNドキュメント http://msdn.microsoft.com/en-us/library/ms187748.aspx SQL:SELECT X = SUBSTRING(例えばベース(0インデックス付けされていない)
からSUBSTRING(value_expression、start_expression、length_expression)
ドキュメントが他言うものの、コメントからstart_expressionが1であるように見える投稿'abcdef'、0,3); 結果:x = 'ab' とNOT x = 'abc'
どうすればこの問題を回避できますか?
私はインメモリ・リストを使用しています。この機能をユニット・テストするにはAsQueryable、NHQueryable APIを使用してインメモリー・インプリメンテーションを本番スワップします。インメモリリストに対して実行される単体テストは失敗します。私はこの問題を回避しようとしている –