chinnuTest Ответов: 3

Или условие в WHERE запроса о. запрос LINQ


Привет,

Я использую нижеприведенный запрос, чтобы получить подробную информацию о сотруднике - если есть какой-либо штатный сотрудник, нам нужно отобразить этого сотрудника, если нет необходимости вытаскивать сотрудника по умолчанию.

var employees = new List<employee>();

var fulltimeemployees= db.Table<fulltimeemp>().Where(fl => siteId == null || fl.SiteId == siteId).Select(e => e.EmployeeId);

employees = db.Table<employee>().Where(e => fulltimeemployees.Contains(e.Id) || e.IsDefault).ToList();

return employees ;



Но некоторые из них, даже несмотря на то, что первое условие существует (что означает, что у нас есть полный рабочий день сотрудника существует), но все же он получает сотрудника по умолчанию тоже. и отображение как информации о сотрудниках, которая является неправильной.

Я новичок в SQL , поэтому просто хочу проверить, что не так с вышеуказанным запросом ? Может ли кто-нибудь помочь мне в этом, пожалуйста ?

Заранее спасибо.

Что я уже пробовал:

Я тоже попробовал нижеприведенный запрос

employees  = db.Table<employee>().Where(e => fulltimeemployees.Where(x=>x.EmployeeId==e.Id).Any() || e.IsDefault).ToList();


но у меня возникли проблемы в
x.EmployeeId
-- ниже Сообщение об ошибке, которое я получаю.

'Guid' does not contain a definition for 'EmployeeId' and no accessible extension method 'EmployeeId' accepting a first argument of type 'Guid' could be found (are you missing a using directive or an assembly reference?)

3 Ответов

Рейтинг:
7

chinnuTest

Исправил это, добавив условия If else. Спасибо вам всем .


Рейтинг:
2

OriginalGriff

Или не означает того, что вы думаете: это означает "либо одно", а не "одно или другое".

Таким образом, если у вас есть список смешанных "а", "в" и "С", то "А или в" вернет все "а"и все "в", но не "с".

Чтобы сделать то, что вы хотите, вам придется выполнить два запроса: один, чтобы получить все "а", а затем только в том случае, если он возвращает нулевые строки, а затем второй запрос, чтобы вернуть "б"

И кстати: это не SQL, это запрос Linq, и он полностью остается в вашем приложении, как только db.Table звонок вернулся.


F-ES Sitecore

"IsDefault", вероятно, не может быть преобразован в предложение SQL, поэтому это делается именно так.

Рейтинг:
1

Maciej Los

Кажется, вы хотите использовать join чтобы получить подробную информацию от "мастер-стола"!

Видеть:
предложение join - ссылка на C# | Microsoft Docs[^]
Выполнение левых внешних соединений (LINQ в C#) | Microsoft Docs[^]

var result = (from fte in fulltimeemployees
    join emp in db.Table<Employee>().Where(e=> e.IsDefault==false) on fte.id equals emp.id into grp
    from item in grp.DefaultIfEmpty()
    select new 
    {
        fte.id,
        //other details here ...
    })
    .ToList();


Примечание: описание проблемы не совсем ясно. Так что я могу ошибаться.


chinnuTest

Привет,

Спасибо, что помогли мне в этом, но у меня возникли проблемы в fte.id даже я попробовал fte.EmployeeId-он говорит, что Guid не имеет определения для EmployeeId.... Извините, что я не предоставил полную информацию о ранее обновленном запросе в своем посте. не могли бы вы мне помочь ?

var employees = новый список<employee>();

ВАР пользователя= дБ.Таблица&ЛТ;fulltimeemp и GT;().Где(ФЛ =&ГТ; значения siteid == нуль || ФЛ.Значения siteid == значения siteid).Выберите(e => e.EmployeeId);

человек = дБ.Таблица&ЛТ;сотрудник&ГТ;().Где(е => у пользователя.Содержит(e.Id) || е.Умолчанию).Список();

возвращение сотрудников ;

chinnuTest

Может быть, кто-нибудь из вас мне в этом поможет ?

chinnuTest

Извините, что я полностью обновил этот вопрос. У меня возникли проблемы в fte.id я действительно изменил его на fte.EmployeeId, но все равно он его не принимает.

'Guid' не содержит определения для 'EmployeeId', и никакой доступный метод расширения 'EmployeeId', принимающий первый аргумент типа 'Guid', не может быть найден (вы пропускаете директиву using или ссылку на сборку?)

Maciej Los

Как я должен знать, если не вижу вашей структуры базы данных и данных?
Мое лучшее предположение таково:

employees = db.Table<employee>()
    .Where(e => fulltimeemployees.Any(fe=> fe.EmployeeId ==e.Id) || e.IsDefault)
    .ToList();

chinnuTest

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

человек = дБ.Таблица&ЛТ;сотрудник&ГТ;()
.Где(е => у пользователя.Любой(fe=> fe.EmployeeId ==e.Id) || е.Свойство isdefault)
.Список();

chinnuTest

ВАР пользователя= дБ.Таблица&ЛТ;fulltimeemp и GT;().Где(ФЛ =&ГТ; значения siteid == нуль || ФЛ.Значения siteid == значения siteid).Список();

человек = дБ.Таблица&ЛТ;сотрудник&ГТ;()
.Где(е => у пользователя.Любой(fe=> fe.EmployeeId ==e.Id) || е.Свойство isdefault)
.Список();

Извините, но публикую в последний раз, если вы видите какую-либо ошибку, пожалуйста, дайте мне знать. Это два запроса, которые я использую, но код ломается во втором, когда он выполняется. Здесь что-то не так ?

Огромное спасибо..

Maciej Los

Откуда мне было знать?