Извлечение данных на основе текста, введенного в TextBox


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

    private void textboxfillnames()
    {
          if (txtlastname.Text != "")
          {

        var totalmembers = from tsgentity in eclipse.members
                             join memtomships in eclipse.membertomships on tsgentity.member_Id equals memtomships.member_Id
                             join mshipoptiions in eclipse.mshipoptions on memtomships.mshipOption_Id equals mshipoptiions.mshipOption_Id
                             join mshiptypes in eclipse.mshiptypes on mshipoptiions.mshipType_Id equals mshiptypes.mshipType_Id
                             join mshipstatus in eclipse.mshipstatustypes on memtomships.mshipStatusType_Id equals mshipstatus.mshipStatusType_Id
                             where tsgentity.member_Lastname.StartsWith(txtlastname.Text)
                             select new {
                                 tsgentity.member_Id,
                                 tsgentity.member_Lastname,
                                 tsgentity.member_Firstname,
                                 tsgentity.member_Postcode,
                                 tsgentity.member_Reference,
                                 tsgentity.member_CardNum,
                                 tsgentity.member_IsBiometric,
                                 tsgentity.member_Dob,
                                 mshiptypes.mshipType_Name,
                                 mshipstatus.mshipStatusType_Name,
                                 memtomships.memberToMship_EndDate                                    
                             };
        dgvReportMembers.DataSource = totalmembers;
    }
    if (txtpostcode.Text != "")
    {

        var totalmembers = from tsgentity in eclipse.members
                          join memtomships in eclipse.membertomships on tsgentity.member_Id equals memtomships.member_Id
                          join mshipoptiions in eclipse.mshipoptions on memtomships.mshipOption_Id equals mshipoptiions.mshipOption_Id
                          join mshiptypes in eclipse.mshiptypes on mshipoptiions.mshipType_Id equals mshiptypes.mshipType_Id
                          join mshipstatus in eclipse.mshipstatustypes on memtomships.mshipStatusType_Id equals mshipstatus.mshipStatusType_Id
                          where tsgentity.member_Postcode.StartsWith(txtpostcode.Text)
                          select new {
                              tsgentity.member_Id,
                              tsgentity.member_Lastname,
                              tsgentity.member_Firstname,
                              tsgentity.member_Postcode,
                              tsgentity.member_Reference,
                              tsgentity.member_CardNum,
                              tsgentity.member_IsBiometric,
                              tsgentity.member_Dob,
                              mshiptypes.mshipType_Name,
                              mshipstatus.mshipStatusType_Name,
                              memtomships.memberToMship_EndDate 

                         };
        dgvReportMembers.DataSource =  totalmembers;  
    }
     if (cbGEStatustype.Text != null)
    { 

         var totalmembers = from tsgentity in eclipse.members
                           join memtomships in eclipse.membertomships on tsgentity.member_Id equals memtomships.member_Id
                           join mshipoptiions in eclipse.mshipoptions on memtomships.mshipOption_Id equals mshipoptiions.mshipOption_Id
                           join mshiptypes in eclipse.mshiptypes on mshipoptiions.mshipType_Id equals mshiptypes.mshipType_Id
                           join mshipstatus in eclipse.mshipstatustypes on memtomships.mshipStatusType_Id equals mshipstatus.mshipStatusType_Id
                           where mshipstatus.mshipStatusType_Name.StartsWith(cbGEStatustype.Text)
                             select new {
                               tsgentity.member_Id,
                               tsgentity.member_Lastname,
                               tsgentity.member_Firstname,
                               tsgentity.member_Postcode,
                               tsgentity.member_Reference,
                               tsgentity.member_CardNum,
                               tsgentity.member_IsBiometric,
                               tsgentity.member_Dob,
                               mshiptypes.mshipType_Name,
                               mshipstatus.mshipStatusType_Name,
                               memtomships.memberToMship_EndDate 

                           };
        dgvReportMembers.DataSource = totalmembers;

    }
}


541
5
задан 14 сентября 2011 в 02:09 Источник Поделиться
Комментарии
2 ответа

Вы должны обернуть каждый запрос в функцию, которая принимает строку и возвращает результат запроса. Вы не должны делать прямая ссылка на GUI объекты в бизнес-логике, как вы сделали.

Вы должны иметь контроллер переговоры о передаче данных между вашей модели (затмения.членов) и Ваше мнение (в различных текстовых и комбинированных окон заполнении).

Редактировать:

Я не уверен, что ваш уровень знаний, но если все, что шли над головой, дайте мне знать и я выложу маленький пример сегодня. ;)

Обещал Пример Кода:

Чтобы узнать больше о том, почему я структурировал код, как это сделать для модели представление докладчика. Ведущий в этом примере контроллер я упомянул выше.

Примечание: вам не следует называть классы и интерфейсы, как это в реальной жизни, но я сделал это, чтобы подчеркнуть, какая часть паттерн MVP я реализации.

Примечание: это не полностью определены классы или интерфейсы. Я только показал соответствующие части на свой вопрос.

//
// Presenter
//
public class Presenter
{
private IView _view;
private IModel _model;

public void FindAndDisplayMemberList
{
// I have made a few assumptions here.
// First, I wasn't sure what dgvReportMembers was. I assumed that it was some
// sort of view object being used to display the results on a form.
//
// Second, I noticed you were assigning it three times. I've assumed that
// you really only want to assign it once. Therefore once this function finds
// a valid field, it returns.
//
// Finally, the large amount of very similar code here should suggest that you
// need to rethink your structure. But without more knowledge of what you are
// building I can't give you much help with that.

string lastName = _view.LastName;
if (!String.IsNullOrEmpty(lastName))
{
var data = _model.GetMemberListFromLastName(lastName);
_view.SetReportMembersDataSource(data);

return;
}

string postalCode = _view.PostalCode;
if (!String.IsNullOrEmpty(postalCode))
{
var data = _model.GetMemberListFromPostalCode(postalCode);
_view.SetReportMembersDataSource(data);

return;
}

string geStatus = _view.SelectedGeStatus;
if (!String.IsNullOrEmpty(geStatus))
{
var data = _model.GetMemberListFromGeStatus(geStatus);
_view.SetReportMembersDataSource(data);

return;
}
}
}

//
// View Interface - Your form that displays the relevant data should implement this.
//
public interface IView
{
string LastName { get; set; }
string PostalCode { get; set; }
string SelectedGeStatus { get; }

void SetReportMembersDataSource(object source);
}

//
// Model Interface - Controller uses this to access the database.
// Your model should not know anything about the
// presenter or the view.
//
public interface IModel
{
//
// NOTE: MemberInfo is a class that should hold all of the fields you
// you are selecting in the query. (Id, LastName, etc.)
//
List<MemberInfo> GetMemberListFromLastName(string lastName);
List<MemberInfo> GetMemberListFromPostalCode(string postalCode);
List<MemberInfo> GetMemberListFromGeStatus(string geStatus);
}

Есть несколько улучшений, обратите внимание на этот код.

Первый код, связанные с видом и моделью изолирован.

Во-вторых, ведущий работает с интерфейсами, поэтому он никогда не должен знать, что фактическая модель или объект представления.

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

3
ответ дан 14 сентября 2011 в 03:09 Источник Поделиться

Я вообще не использовать LINQ все, что много, потому что большую часть времени, это не так мощно. Я вместо того, чтобы использовать представления (виды баз данных, чтобы не ошибиться с видом от предыдущих ответа ;Г) которые создаются вручную, вместо того, чтобы динамично во время выполнения (=по LINQ).

В этой ситуации я уверен, что это не имеет значения все, что много, видя, как вы используете "выберите новый {...});", которая, по моему опыту, означает, что запросы остаются относительно "чистые".

Однако, если вы используете большое "содержит()" или другие LINQ-команды, LINQ, которая имеет трудное время, создавая хороший запрос. Если вы используете SQL профайлера (инструмент, мне нравится использовать anjlab) вы можете увидеть, какой запрос отправляется в базу данных (на самом деле хороший способ, чтобы увидеть, если вы должны написать запрос самостоятельно или нет).

Если вы используете рамки сущности можно вставить вид в вашей модели, и назвать его, как это табель (от члена в контекст objectcontext.vwblalbah выбрать члена), Вы можете по-прежнему использовать где заявления о, если бы вы, пожалуйста, (где-членов.memberID == ИД)...

Если вам не нравится писать представления в базе данных, вы можете также предварительно создавать запросы, так что LINQ, которая не должна динамично создать его. Я думаю (не уверен правда), что взгляды еще быстрее.

Я надеюсь, что это помогло

1
ответ дан 15 сентября 2011 в 07:09 Источник Поделиться