2016-04-07 65 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();