2014-02-28 29 views
0
PROJ_ClientAccount Client = db.PROJ_ClientAccount.Where(x => x.Id == 1).FirstOrDefault(); 
    PROJ__VATRateRecord VatRecord = db.PROJ_VATRateRecord.Where(x => x.Id == 2).FirstOrDefault(); 
    PROJ__ProductRecord ProductRecord = db.PROJ_ProductRecord.Where(x => x.Id == sale.Value.ProductId).FirstOrDefault(); 

if (Client == null) 
{ 
throw new Exception("Error creating new Order Record, Client Account can't be empty"); 
} 

if (VatRecord == null) 
{ 
throw new Exception("Error creating new Order Record, VAT can't be empty"); 
} 

if (ProductRecord == null) 
{ 
throw new Exception("Error creating new Order Line Record, ProductRecord can't be empty"); 
} 

我想對此進行重構,只使用一條if語句。 如果( 「任何記錄爲空」) { 拋出新的異常(「RROR創造秩序, 」記錄「 不能爲空 }如何將語句重構爲一條語句

感謝

+3

'如果(客戶== NULL || VatRecord == NULL || ProductRecord == NULL)'? –

+3

你知道如何使用LINQ,但你問如何結合三個'if'語句?我覺得我失去了一些東西... –

+1

什麼@SudhakarTillapudi建議,是你如何實現你想要的。但我的問題是,你有不同的例外,你從每個「if」塊拋出。如果它的業務需要顯示不同的消息,我認爲你應該保持'if'塊的原樣。看看你拋出的異常看起來更像是一個驗證代碼,而不是一個異常 – Nilesh

回答

3
if (Client == null || VatRecord == null || ProductRecord == null) 
{ 
    throw new Exception("Error creating new Order, \"record\" cannot be empty"); 
} 

這將創建之間的or聲明3條件,如果其中任何一個出現,那麼將拋出異常

但是,這種重構對我來說沒有多大意義,將代碼保留原樣可能更好一些爲此提供更多的描述性錯誤信息e用戶。

0

正如我在我的意見建議,你這是怎麼實現的:

if (Client == null || VatRecord == null || ProductRecord == null) 
{ 
    throw new Exception("Error creating new Order,Record can't be empty"); 
} 

但如果所有類型的(進行比較)類似於那麼你可以使用如下null-coalescing操作:

注意:下面的示例僅適用於所有三種類型都相似。

var obj = Client ?? VatRecord ?? ProductRecord ?? null; 
if(obj == null) 
{ 
throw new Exception("Error creating new OrderRecord can't be empty"); 
} 
0

我不認爲對businessrule驗證拋出異常是最好的想法,但如果你要密切合作,你有什麼堅持,你可以利用對FirstOrDefault有一個自定義異常消息作爲參數擴展方法。

這是擴展方法:

public static class BusinessValidator 
{ 
    public static TSource FirstOrDefault<TSource>(
     this IEnumerable<TSource> source, string message) 
    { 
     TSource src = source.FirstOrDefault(); 
     if (src == null) 
     { 
      throw new Exception(message); 
     } 
     return src; 
    } 
} 

您當前的西港島線的代碼進行重構,以:

PROJ_ClientAccount Client = db 
        .PROJ_ClientAccount 
        .Where(x => x.Id == 1) 
        .FirstOrDefault("Error creating new Order Record, Client Account can't be empty"); 
PROJ__VATRateRecord VatRecord = db 
        .PROJ_VATRateRecord 
        .Where(x => x.Id == 2) 
        .FirstOrDefault("Error creating new Order Record, VAT can't be empty"); 
PROJ__ProductRecord ProductRecord = db 
        .PROJ_ProductRecord 
        .Where(x => x.Id == sale.Value.ProductId) 
        .FirstOrDefault("Error creating new Order Line Record, ProductRecord can't be empty"); 
0

這是更好地讓三個語句如,但要回落較早。

所以移動每個語句就這樣在每次操作後右:

PROJ_ClientAccount Client = db.PROJ_ClientAccount.Where(x => x.Id == 1).FirstOrDefault(); 

if (Client == null) 
{ 
throw new Exception("Error creating new Order Record, Client Account can't be empty"); 
} 

PROJ__VATRateRecord VatRecord = db.PROJ_VATRateRecord.Where(x => x.Id == 2).FirstOrDefault(); 

if (VatRecord == null) 
{ 
throw new Exception("Error creating new Order Record, VAT can't be empty"); 
} 

PROJ__ProductRecord ProductRecord = db.PROJ_ProductRecord.Where(x => x.Id == sale.Value.ProductId).FirstOrDefault(); 

if (ProductRecord == null) 
{ 
throw new Exception("Error creating new Order Line Record, ProductRecord can't be empty"); 
}