2011-09-14 29 views
1

如何將兩種方法轉換爲單一方法以提高效率並製作清晰簡潔的代碼?如何將兩種方法轉換爲單一方法來提高效率?

我有三個條件,像這樣的檢查,但我沒有提到(時間太長):

public void getmembershipstatusmembers() 
{ 
     if (cbGEStatustype.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 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;  
     } 
    } 
    public void getcardnumbers() 
    { 
     if (txtcardnum.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_CardNum.StartsWith(txtcardnum.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; 
     } 

    } 

我期待這樣的事情:

private void allmembers() 
{ 
     var members = from ...... 
          ....... 
          ....... 
     if (cbGEStatustype.Text != "") 
     { 
      dgvreports.datasource = members.where(.......) 
     } 
     if (txtcardnum.Text != "") 
     {  
      dgvreports.datasource = members.where(.......) 
     } 
    } 
+0

爲什麼不是你在底部粘貼的工作?產生了什麼錯誤,或者什麼限制了你這樣做? – qJake

+1

通過將所有內容填充到一個單一方法中,代碼並沒有變得更加清晰和簡潔。效率也不高。 –

+0

@SpikeX我已經嘗試了僅限於成員表格檢查的底層部分,並且我在連接條件中包含了另外三個表格......我無法檢查其他表格,假設像這樣的「cbGEStatustype.Text」,它來自mshipstatustype表格.....我無法使用表中的mshipstatustype name字段來檢查這一個...... –

回答

1

如果我正確閱讀這個,我會認爲你可以創建你的方法,而不是直接將數據源設置爲查詢結果,它將結果作爲IQueryable對象返回,以便您可以應用您需要的許多後續過濾器。困難,我想可能是你的兩個方法似乎使用了一種匿名類型,它不能在方法間進行通信,但是你可以創建一個簡單的類型定義來填補空缺。

例如

public class Foo { 
public string MemberID { get; set;} 
public string LastName { get; set;} 
// ... etc. 
} 

public IQueryably<Foo> GetUnfiltereredSource() 
{ 
    // NOTE: No WHERE here... 
    return 
     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 
     select new Foo 
     { 
      MemberID = tsgentity.member_Id, 
      LastName = tsgentity.member_Lastname, 
      // ... etc. 
     }; 
} 

public void DoStuff() 
{ 
    dgvreports.datasource = GetUnfilteredSource().Where(x => x.MemberCardNumber.StartsWith(...)); 

    // OR 

    dgvreports.datasource = GetUnfilteredSource().Where(x => x.MemberShipStatusType.StartsWith(...)); 

    // etc.. 
} 
3

你找了錯誤的樹。使用其中一種方法做其他兩種方法的工作有時是一個好主意,但絕不會使您的代碼的效率更高(或更低)。

建議的更改會使您的代碼更清晰嗎?這是值得的。它會減少重複嗎?這也值得去做。這是正確的改變嗎?看看你的代碼,我猜想一個更好的方法是將你的方法的公共部分提取到一個新方法中,並從你現有的方法調用這個新方法。

+0

我正在尋找同樣的東西,避免重複我該怎麼做...你會給任何示例代碼.... –

+0

你的兩個代碼塊看起來一樣,除了用'txtcardnum替換'cbGEStatustype.Text'。 Text'。所以如果你有一個方法把文本作爲參數,你可以用'cbGEStatustype.Text'或'txtcardnum.Text'來調用該方法。明白了嗎? –

+0

txtcardnum.text正在比較數據與cardnum的成員表和cbgestatustype比較數據與mshipstatus類型表..如何將它是相同的? –

相關問題