#c# #asp.net #linq
#c# #asp.net #linq
Вопрос:
У меня есть критерии поиска для поиска информации о транспортном средстве на основе двух видов информации. Первый — это имя контейнера и пользовательское объявление
У меня есть одна кнопка с текстовым поиском и два текстовых поля, первый текст для имени контейнера, а второй для пользовательского объявления.
Я использую EF для объединения трех таблиц с такими содержимым, как это:
var query = (from con in db.Containers
join v in db.Vehicles on con.cont_vehicleid equals v.vehl_VehicleID
join cust in db.Custom_Captions on v.vehl_state equals cust.Capt_Code
where cust.Capt_Family == "vehl_state" amp;amp; v.vehl_Deleted == null amp;amp; con.cont_Deleted == null amp;amp;
v.vehl_ClearanceCompany == p.pusr_CompanyId amp;amp; con.cont_Name.Contains(txtContNo.Text)
select new
{
cont_name = con.cont_Name,
vehl_Name = v.vehl_Name,
VehicleState = v.vehl_state,
vehl_drivername = v.vehl_drivername,
vehl_entrancedate = v.vehl_entrancedate,
vehl_customsdec = v.vehl_customsdec,
cont_rampid = v.vehl_rampid
}).ToList();
var query2 = (from con in db.Containers
join v in db.Vehicles on con.cont_vehicleid equals v.vehl_VehicleID
join cust in db.Custom_Captions on v.vehl_state equals cust.Capt_Code
where cust.Capt_Family == "vehl_state" amp;amp; v.vehl_Deleted == null amp;amp; con.cont_Deleted == null amp;amp;
v.vehl_ClearanceCompany == p.pusr_CompanyId amp;amp; con.cont_customdec.Contains(txtCust.Text)
select new
{
cont_name = con.cont_Name,
vehl_Name = v.vehl_Name,
VehicleState = v.vehl_state,
vehl_drivername = v.vehl_drivername,
vehl_entrancedate = v.vehl_entrancedate,
vehl_customsdec = v.vehl_customsdec,
cont_rampid = v.vehl_rampid
}).ToList();
первый запрос содержит условие для имени контейнера (txtContNo.Text)
второй запрос 2 с именем контейнера формы содержит условие (txtCust.Text)
и это оператор if, который я использовал для обработки запроса для выполнения :
if (txtContNo.Text != null)
{
rptVehl.DataSource = query;
rptVehl.DataBind();
}
if (txtCust.Text != null)
{
rptVehl.DataSource = query2;
rptVehl.DataBind();
}
rptVehl — это инструмент повторения
Каждый раз, когда я компилирую код, ошибок нет, но когда я ввожу имя контейнера в (txtContNo.Text), данные не отображаются, также, когда я использую точку трассировки, код в первом операторе if, который принадлежит (txtContNo.Text), не попадает.
Когда я ввожу пользовательское объявление, оно работает и выдает мне данные о том, что я ищу?
Обратите внимание: если я опущу первый оператор if, второй будет работать нормально и даст мне желаемый результат.
Я думаю, что с логикой if что-то не так. Может кто-нибудь разобраться?
Комментарии:
1. Вы можете сделать общий запрос для обоих условий. если пользователь вводит значение в оба текстовых поля, ваша логика if не будет работать.
2. @SanthoshNayak Как я мог это сделать, пожалуйста, объясните?
3. Поставьте точку останова и проверьте, есть ли какие-либо значения в txtContNo. Текст при поиске
Ответ №1:
Не пробовал, вы можете попробовать что-то вроде этого:
var query = (from con in db.Containers
join v in db.Vehicles on con.cont_vehicleid equals v.vehl_VehicleID
join cust in db.Custom_Captions on v.vehl_state equals cust.Capt_Code
where cust.Capt_Family == "vehl_state" amp;amp; v.vehl_Deleted == null amp;amp; con.cont_Deleted == null amp;amp;
v.vehl_ClearanceCompany == p.pusr_CompanyId amp;amp;( con.cont_Name.Contains(txtContNo.Text==null?con.cont_Name:txtContNo.Text)||con.cont_customdec.Contains(txtCust.Text==null?con.cont_customdec:txtCust.Text))
select new
{
cont_name = con.cont_Name,
vehl_Name = v.vehl_Name,
VehicleState = v.vehl_state,
vehl_drivername = v.vehl_drivername,
vehl_entrancedate = v.vehl_entrancedate,
vehl_customsdec = v.vehl_customsdec,
cont_rampid = v.vehl_rampid
}).ToList();
rptVehl.DataSource = query;
rptVehl.DataBind();
Комментарии:
1. большое вам спасибо, он отлично работает с txtContNo. Текст, но когда я ищу txtCust. Текст это дает мне две записи с одинаковой информацией в повторителе?
2. измененное условие
3. проверено, но возникла та же проблема
Ответ №2:
Я бы внес небольшое изменение в Linq и сделал его единым:
var query = (from con in db.Containers
join v in db.Vehicles on con.cont_vehicleid equals v.vehl_VehicleID
join cust in db.Custom_Captions on v.vehl_state equals cust.Capt_Code
where cust.Capt_Family == "vehl_state" amp;amp; v.vehl_Deleted == null amp;amp; con.cont_Deleted == null amp;amp;
v.vehl_ClearanceCompany == p.pusr_CompanyId
select new
{
cont_name = con.cont_Name,
vehl_Name = v.vehl_Name,
VehicleState = v.vehl_state,
vehl_drivername = v.vehl_drivername,
vehl_entrancedate = v.vehl_entrancedate,
vehl_customsdec = v.vehl_customsdec,
cont_rampid = v.vehl_rampid
}).ToList();
if(txtConNo.Text != "")
{
query = query.Where(con => con.cont_Name.Contains(txtContNo.Text))
}
if(txtCust.Text != "")
{
query = query.Where(con => con.cont_customdec.Contains(txtCust.Text))
}
Наконец, привязка к GridView
:
rptVehl.DataSource = query;
rptVehl.DataBind();
Комментарии:
1. можете ли вы получить доступ к con в рамках условия if?
2. продолжение
con.cont_Name.Contains(txtContNo.Text)
3. Обновлено. Теперь это сработает. Спасибо за уведомление @Santhosh Nayak.
4. Не работает? в редакторе выдает ошибки преобразования
5. Большое вам спасибо, я изменил код, который вы мне даете, и сработал? я хочу выбрать ваш ответ, но я изменяю код @SanthoshNayak, поэтому я не знаю, чей ответ выбрать?
Ответ №3:
Прежде всего, я хотел бы сказать спасибо вам за каждого, кто внес свой вклад в ответ на мой вопрос.
Я изменил код для AT-2016 и Santhosh Nayak
так что у меня это работает на 100%.
var query = (from con in db.Containers
join v in db.Vehicles on con.cont_vehicleid equals v.vehl_VehicleID
join cust in db.Custom_Captions on v.vehl_state equals cust.Capt_Code
where cust.Capt_Family == "vehl_state" amp;amp; v.vehl_Deleted == null amp;amp; con.cont_Deleted == null amp;amp;
v.vehl_ClearanceCompany == p.pusr_CompanyId amp;amp; con.cont_Name.Contains(txtContNo.Text == null ? con.cont_Name : txtContNo.Text)
select new
{
cont_name = con.cont_Name,
vehl_Name = v.vehl_Name,
VehicleState = v.vehl_state,
vehl_drivername = v.vehl_drivername,
vehl_entrancedate = v.vehl_entrancedate,
vehl_customsdec = v.vehl_customsdec,
cont_rampid = v.vehl_rampid
}).ToList();
var query2 = (from con in db.Containers
join v in db.Vehicles on con.cont_vehicleid equals v.vehl_VehicleID
join cust in db.Custom_Captions on v.vehl_state equals cust.Capt_Code
where cust.Capt_Family == "vehl_state" amp;amp; v.vehl_Deleted == null amp;amp; con.cont_Deleted == null amp;amp;
v.vehl_ClearanceCompany == p.pusr_CompanyId amp;amp; con.cont_customdec.Contains(txtCust.Text == null ? con.cont_customdec : txtCust.Text)
select new
{
cont_name = con.cont_Name,
vehl_Name = v.vehl_Name,
VehicleState = v.vehl_state,
vehl_drivername = v.vehl_drivername,
vehl_entrancedate = v.vehl_entrancedate,
vehl_customsdec = v.vehl_customsdec,
cont_rampid = v.vehl_rampid
}).ToList();
if (txtContNo.Text != "")
{
rptVehl.DataSource = query;
rptVehl.DataBind();
}
if (txtCust.Text != "")
{
rptVehl.DataSource = query2;
rptVehl.DataBind();
}
Я не буду выбирать это как принятый ответ, большое вам спасибо
AT-2016 и Santhosh Nayak