Динамические предложения Where с несколькими объединениями с использованием Linq - PullRequest
0 голосов
/ 05 января 2012

Мне нужно создать динамическое предложение where в операторе Linq с несколькими объединениями.

  • .Net 3.5
  • Linq-To-Sql

У меня есть эти входящие параметры для оператора Linq, требуется только «UID».

int uid = 23702;  // <-- Only one Required
string courseNumber = "";
string title = "";
int? categoryId = null;
int? typeId = null;

Я проверял это в LinqPad и получил запрос для работы со всеми Гдена месте, параметры Nullable int возвращают неверные результаты.

Вот мой оператор Linq:

var ci = course_instances;

var query = courses.Join(ci, 
    c => c.course_id, 
    i => i.course_id, 
    (c, i) => new
{
    c = c,
    i = i
}).Join(user_courses, 
    temp => temp.i.instance_id, 
    uc => uc.instance_id, 
    (temp, uc) => new
{
    temp = temp,
    uc = uc
})
.Where (temp1 => (temp1.uc.uid == uid))
.Where (temp1 => (temp1.temp.c.course_number.Contains(courseNumber)))
.Where (temp1 => (temp1.temp.c.title.Contains(title)))
//.Where (temp1 => (temp1.temp.c.course_type_id == typeId))  
//.Where (temp1 => (temp1.temp.c.course_category_id == categoryId))
.Select (temp1 => new CourseSearchMyCourses
{
    // snipped the many properties
});

Я пытался использовать PredicateBuilder, но он возвращает ошибку:

Аргументы типа для метода 'System.Linq.Queryable.Where (System.Linq.IQueryable, System.Linq.Expressions.Expression>)' не могут быть выведены из использования.Попробуйте явно указать аргументы типа.

Вот моя попытка PredicateBuilder Linq:

var conditions = PredicateBuilder.True<user_course>();
conditions = conditions.And(c => c.uid == uid);

var ci = course_instances;

var query = courses.Join(ci, 
    c => c.course_id, 
    i => i.course_id, 
    (c, i) => new
{
    c = c,
    i = i
}).Join(user_courses, 
    temp => temp.i.instance_id, 
    uc => uc.instance_id, 
    (temp, uc) => new
{
    temp = temp,
    uc = uc
})
.Where (conditions)

.Select (temp1 => new CourseSearchMyCourses
{
    // snipped the many properties
});

Кстати, я также попытался использовать "System.Linq.Dynamic", используя строковые запросы, и получилошибка "и" не распознается.

Любая помощь приветствуется.

Спасибо.

1 Ответ

0 голосов
/ 07 января 2012

Предикаты Linq с переменными типа nullable переводятся в предикат SQL = NULL.Но это полностью отличается от того, что должно быть: IS NULL.

Вы ожидаете получить строки, в которых course_type_id пуст, но сравнение = не возвращает результатов, поскольку NULL не является значением, а сравнение возвращает UNKNOWN.,Я думаю, что это является причиной ваших «неправильных результатов».

Если это ваша проблема, можно найти исправление здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...