基于复选框的LINQ连接

时间:2016-03-22 20:10:37

标签: c# wpf entity-framework linq

我在C#WPF应用中使用Entity Framework 6.0。我有这个查询来搜索Employee实体:

var query = Context.Employees.AsQueryable();
switch (selectedColumnValue)
{
    case "lastName":
        query = query.Where(q => q.lastName == SearchValue);
        break;
    case "employeeID":
        query = query.Where(q => q.personnelID == SearchValue);
        break;
    case "securityID":
        query = query.Where(q => q.securityID == SearchValue);
        break;
    default:
        return;
}

父实体Employee可能在EmployeeStatus实体中有一些子行,以指示员工是否处于非活动状态,请假或存档。 Employee实体的主键是employeeID,并且是EmployeeStatus上的外键。

以下是Employee实体的列:

public int employeeID { get; set; }
public string personnelID { get; set; }
public string securityID { get; set; }
public string firstName { get; set; }
public string middleName { get; set; }
public string lastName { get; set; }
public string suffix { get; set; }
public string job { get; set; }
public string organizationalUnit { get; set; }
public string costCenter { get; set; }
public string notes { get; set; }
public System.DateTime createdDate { get; set; }    

这是EmployeeStatus实体的专栏

public int employeeStatusID { get; set; }
public int employeeID { get; set; }
public int validEmployeeStatusID { get; set; }
public Nullable<System.DateTime> exitDate { get; set; }
public System.DateTime createdDate { get; set; }

如果用户点击了复选框&#34;包含已存档的员工?&#34;在搜索过程中,我们需要加入EmployeeStatus并添加EmployeeStatusvalidEmployeeStatusID等于5(已存档)的条件。你如何在LINQ中做到这一点?

更新:我需要在IF语句中的上述switch语句之后添加Linq连接,例如:

if (IncludeArchived)
{
   // Add to Linq query here using method syntax
}

所以Linq语句需要使用方法语法。

2 个答案:

答案 0 :(得分:1)

这个查询怎么样?

query = (from empl in query
         join status in Context.Status on empl.employeeID equals status.employeeID
         where status.employeeStatusID == 5
         select empl).Distinct();

或者您可以执行链:

query = query.Join(Context.Status, x => x.employeeID, x => x.employeeID, (a, b) => new { a, b })
    .Where(x => x.b.employeeStatusID == 5).Select(x => x.a).Distinct();

答案 1 :(得分:1)

实际上,你不需要 来在switch语句之后添加它。

在您当前的实施中,您包括所有员工(甚至是已存档的员工)。因此,如果未选中复选框,您实际上需要进行此操作以排除已存档的文件。

注意:我假设您拥有实体的导航属性。

var query = Context.Employees.AsQueryable();

if (!IncludeArchived)
{
    query = query.Where(e => e.Status == null || e.Status.employeeStatusId != 5);
}

switch (selectedColumnValue)
{
     // ...
}