2012-05-23 1 views
0

Я использую nHibernate 3.2.0.4000. Я написал этот запрос, используя nHibernate.LinqNotSupportedException, когда я использую метод в разделе where

var entities = (from t in this.Session.Query<Task>() 
       where NotIn(t, role.Tasks) 
       select t).ToList(); 

Вот определение метода NotIn()

private bool NotIn(Task t, IEnumerable<TaskDto> tasks) 
{ 
    foreach (var task in tasks) 
    { 
     if (t.Name == task.Name) return false; 
    } 
    return true; 
} 

Когда я исполняющим этот запрос, я получил сообщение об ошибке: NotSupportedException

Boolean NotIn(Probel.NDoctor.Domain.DAL.Entities.Task, System.Collections.Generic.IEnumerable`1[Probel.NDoctor.Domain.DTO.Objects.TaskDto]) 

Я нашел решение non Linq, которое менее читаемо, но я все же хочу, по крайней мере, понять, почему невозможно создайте такой запрос Linq.

Заранее благодарю вас за помощь!

+0

Возможно, вы получите это, потому что LINQ не знает, как преобразовать ваш метод в SQL. Вы можете сказать, как это сделать, но я думаю, что это требует довольно много работы, используя деревья выражений. –

+2

Будет что-то вроде 'where! Role.Tasks.Contains (t.Name)' work? –

ответ

2

Вы должны перевести NotIn на запрос NHibernate SQL с помощью дерева выражений.

nhibernate linq provider extension - хорошая отправная точка.

this link имеет In и NotIn метод расширения для nHibernate.

1

Ваш код в Linq в конечном итоге переведен на SQL-запрос nhibernate. Вы не можете использовать метод, который не может быть переведен в код SQL.

0

NHibernate не может декомпилировать и затем проанализировать ваш код, чтобы получить действительный SQL. Невозможно создать инструкцию sql из вашего метода.

0

Вместо этого используйте:

var entities = (from t in this.Session.Query<Task>() 
       where !role.Tasks.Any(rt => rt.Name == t.Name) 
       select t).ToList(); 
+0

Still NotSupportedException, что нормально, учитывая другие ответы о переводе выражения Linq в SQL –