Синтаксис метода Linq - не может конвертировать IQueryable в Bool - PullRequest
0 голосов
/ 02 мая 2011

Я пытаюсь перефакторизовать запрос 1 к синтаксису запроса 2 ... из-за более читаемых и т. Д. Параметров, таких как "group, begindate, enddate и excludeManifestatie, передаются через аргумент (метод parms). Я проверяю,пусто или нет) прошло или нет, так что я могу построить свой динамический Linq SQL.

Но я получаю ошибку в Query 1, когда я использую .... Проверка HasValue. Она говорит: "Невозможно неявно преобразовать тип'System.Linq.IQueryable' to 'bool' "

Query 2 работает нормально, и это то, что я хочу, но у него сложный синтаксис, поэтому мне нужно исправить синтаксис Query 1.

ЗАПРОС 1:

((String.IsNullOrEmpty(group)) ? (a.id != -1) : (a.no_group == group))
&& ((group.Equals("990") || (group == string.Empty)) ? (!a.displaylocal.HasValue || a.displaylocal.Value == false) : (a.id != -1))
&& ((a.begindate.HasValue ? DateTime.Now >= a.begindate.Value : a.id != -1) &&
    (a.enddate.HasValue ? DateTime.Now <= a.enddate.Value : a.id != -1))
&& ((String.IsNullOrEmpty(excludeManifestatie)) ? (a.id != -1) : (a.type_manifestation != excludeManifestatie))

НОВЫЙ / ЛУЧШИЙ СПОСОБ НАПИСАТЬ:

ЗАПРОС 2:

   var query = dc.agenda.AsQueryable();
if (!string.IsNullOrEmpty(group))
    query = query.Where(a => a.no_group == group);
if (group.Equals("990") || group.Equals(string.Empty))
    if ((query.Where(a => a.displaylocal.HasValue))) //Gives ERROR
        query = query.Where(a => a.displaylocal >= DateTime.Now);
if (!string.IsNullOrEmpty(excludeManifestatie))
    query = query.Where(a => a.type_manifestation != excludeManifestatie);
if (query.Where(a => a.begindate.HasValue)) //Gives ERROR
    query = query.Where(a => a.begindate <= DateTime.Now);
if ((query.Where(a => a.enddate.HasValue))) //Gives ERROR
    query = query.Where(a => a.enddate >= DateTime.Now);

Ответы [ 3 ]

4 голосов
/ 02 мая 2011

Вы не можете сделать это так. Если вы хотите включить условие на основе данных в каждую отдельную строку, вам нужно прибегнуть к своему пути. Метод, который я показал вам в вашем последнем вопросе, работает, только если условие должно быть добавлено на основе внешнего параметра. Я бы использовал это условие:

query = query.Where(a => (a.begindate.HasValue && a.begindate <= DateTime.Now) || 
                         !a.begindate.HasValue);

Ваш полный код выглядит так:

var query = dc.agenda.AsQueryable();
if (!string.IsNullOrEmpty(group))
    query = query.Where(a => a.no_group == group);
if (group.Equals("990") || group.Equals(string.Empty))
    query = query.Where(a => (a.displaylocal.HasValue && a.displaylocal >= DateTime.Now) || 
        !a.displaylocal.HasValue);
if (!string.IsNullOrEmpty(excludeManifestatie))
    query = query.Where(a => a.type_manifestation != excludeManifestatie);
query = query.Where(a => (a.begindate.HasValue && a.begindate <= DateTime.Now) || 
                         !a.begindate.HasValue);
query = query.Where(a => (a.enddate.HasValue && a.enddate >= DateTime.Now) || 
                         !a.enddate.HasValue);
1 голос
/ 02 мая 2011

Это не когда вы используете HasValue, это когда вы используете Where в качестве условия.

Если вы хотите проверить, есть ли какие-либо элементы, которые соответствуют условию HasValue, вам следует использовать Any вместо Where:

if (query.Any(a => a.begindate.HasValue))
0 голосов
/ 02 мая 2011

попробуйте изменить с

query = query.Where(a => a.no_group == group);

до

query = query.SingleOrDefault(a => a.no_group == group);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...