2016-04-07 66 views
1

我想在LINQ查詢添加Enum條件即使枚舉條件在LINQ查詢在C#

我在模型篩選目的而添加ALL因此如果用戶選擇ALL,那麼所有的數據應該枚舉數據成員爲空或空顯示

Web Screen

數據模型:

public partial class AuditTable 
    { 
     public int ID { get; set; } 
     public int CompanyId { get; set; } 
     public int KeyFieldID { get; set; } 
     public System.DateTime DateTimeStamp { get; set; } 
     public EntityType DataModel { get; set; } 
     public string ValueBefore { get; set; } 
     public string ValueAfter { get; set; } 
     public string Changes { get; set; } 
     public AuditActionType AuditActionTypeENUM { get; set; } 

     public int EmployeeId { get; set; } 
     public string EmployeeCode { get; set; } 
     public string Remarks { get; set; } 
     public string IPAddress { get; set; } 
     public string UserName { get; set; } 
    } 
public enum AuditActionType 
    { 
     All = 1, 
     Create, 
     Update, 
     Delete 
    } 

    public enum EntityType 
    { 
     All = 1, 
     BasicDetails, 
     EmployeeDetails, 
     PersonalDetails     
    } 

下面的代碼是工作正常,但不得不重複相同的查詢4次。我想將下面的查詢合併爲一個

if (eType == EntityType.All) 
if (aType == AuditActionType.All) 
    AuditTrail = ent.tblAuditTable.Where(s => s.KeyFieldID == ID && s.EmployeeCode.Contains(code) && s.UserName.Contains(username)).OrderByDescending(s => s.DateTimeStamp).ToList(); 
else 
    AuditTrail = ent.tblAuditTable.Where(s => s.KeyFieldID == ID && s.AuditActionTypeENUM == aType && s.EmployeeCode.Contains(code) && s.UserName.Contains(username)).OrderByDescending(s => s.DateTimeStamp).ToList(); 
else 
if (aType == AuditActionType.All) 
AuditTrail = ent.tblAuditTable.Where(s => s.KeyFieldID == ID && s.DataModel == eType && s.EmployeeCode.Contains(code) && s.UserName.Contains(username)).OrderByDescending(s => s.DateTimeStamp).ToList(); 
else 
AuditTrail = ent.tblAuditTable.Where(s => s.KeyFieldID == ID && s.AuditActionTypeENUM == aType && s.DataModel == eType && s.EmployeeCode.Contains(code) && s.UserName.Contains(username)).OrderByDescending(s => s.DateTimeStamp).ToList(); 

回答

4

您可以連鎖Where()報表。

var baseQuery = ent.tblAuditTable.Where(s => s.KeyFieldID == ID && s.EmployeeCode.Contains(code) && s.UserName.Contains(username)); 

var realQuery = baseQuery; 

if (eType != EntityType.All){ 
    realQuery = realQuery.Where(s=>s.DataModel == eType); 
} 

if (aType != EntityType.All){ 
    realQuery = realQuery.Where(x=>s.AuditActionTypeENUM == aType); 
} 

var result = realQuery.OrderByDescending(s => s.DateTimeStamp).ToList() 

AuditTrail = result; 
1

所有在一起的查詢?

像這樣:

bool eTypeIsAll = eType == EntityType.All; 
bool aTypeIsAll = aType == AuditActionType.All; 
AuditTrail = 
    ent.tblAuditTable 
     .Where(s => s.KeyFieldID == ID 
        && (
         eTypeIsAll ? (
          (
           !aTypeIsAll ? 
            s.AuditActionTypeENUM == aType 
            : true 
          ) 

         ) 
         : (
          (
           !aTypeIsAll ? 
            s.AuditActionTypeENUM == aType 
            : true 
          ) 
          && s.DataModel == eType 

         ) 

        ) 
        && s.EmployeeCode.Contains(code) 
        && s.UserName.Contains(username)) 
     .OrderByDescending(s => s.DateTimeStamp) 
     .ToList(); 

就個人而言,我更喜歡這種方式。但很多人都說@Jehof方法更具可讀性。

+0

不僅另一種是更具可讀性,而且還產生較好的SQL查詢(與目前的查詢提供)。 –

+0

我也一樣,但我已經在我的操場上測試了幾種不同的方法,並沒有發現很大的不同,從查詢到查詢只有5-10ms ...並且由於您不會自己讀取SQL查詢,它不會真的不重要。 –

+0

我認爲這更多的是關於個人偏好 –

0

您應該使用IQueryables。 沒有必要在一行中編寫查詢。你可以在多個子查詢中傳播它。

var queryAble= ent.tblAuditTbale.where(s=>s.KeyFieldId ==Id); 

if(eType !=EntityType.All) 
queryAble = queryAble.where(s=> s.DataModel==eTYpe); 

If(aType!= AuditActionType.All)  
queryAble = queryAble.where(s=> s.AuditActionTypeENUM == aType); 

Finnally(查詢現在執行)

AuditTrail = queryAble.ToList();