2014-05-19 29 views
0

我想要将加入语句结果设置为模型视图。将加入语句结果设置为类模型

但问题:有4个名称字段要搜索,但只有名字是强制性的,其他不是。

LINQ statment

public static List<Laborer> getLaborerByName(int? laborOfficeNo, long? componyNo, string firstName, string secondName, string thirdName, string fourthName) 
{ 
    var queryGetLaborerByName = (from c in db.Compny 
           join x in db.Laborer on c.PK_componyId equals x.FK_componyId 
           where c.SequenceNumber == componyNo 
            && c.FK_LaborOfficeId == laborOfficeNo 
           select x); 
    if (!String.IsNullOrEmpty(firstName)) 
     queryGetLaborerByName = queryGetLaborerByName.Where(pr => pr.FirstName.Contains(firstName)); 
    if (!String.IsNullOrEmpty(secondName)) 
     queryGetLaborerByName = queryGetLaborerByName.Where(pr => pr.SecondName.Contains(secondName)); 
    if (!String.IsNullOrEmpty(thirdName)) 
     queryGetLaborerByName = queryGetLaborerByName.Where(pr => pr.ThirdName.Contains(thirdName)); 
    if (!String.IsNullOrEmpty(thirdName)) 
     queryGetLaborerByName = queryGetLaborerByName.Where(pr => pr.FourthName.Contains(fourthName)); 
    if (queryGetLaborerByName.ToList().Count > 0) 
    { 
     return queryGetLaborerByName.ToList(); 
    } 
    return null; 
} 

ViewModle:

 public string LaborerFirstName { get; set; } 
     public string LaborerSecondName { get; set; } 
     public string LaborerThirdName { get; set; } 
     public string LaborerFourthName { get; set; } 

如何使它工作与维护检索算法过滤模型。

我希望它清除了解

它似乎无法理解。 我想要的是保持搜索过滤。其中接受论文的情景:

  1. 搜索按名字only.Result:将所有的员工都匹配的输入名字的名字。

  2. 按姓名和名字搜索。结果:将所有员工姓名与名字输入的名字和姓氏相匹配。

  3. 按名和名和第三名搜索。结果:将所有员工的名字都与名字输入的名字和第二名和第三名匹配。

  4. 按名和姓,名和第三名和第四名搜索。结果:将所有员工姓名分为第一名和第二名,第三名和第四名匹配姓名输入。所以这里大部分会显示通缉员工的名字。

+0

什么问题? – Larry

+0

我无法看到问题与您的代码是什么。您是否遇到错误?调用queryGetLaborerByName.ToList();的结果是否与预期不符? –

+0

问题是如何在将结果分配到列表时保持搜索过滤工作正常。 – user3509742

回答

0

所有你需要做的是使用一个或状况例如允许匹配或具有空字符串:

(SecondName equals SecondName or SecondName equals EmptyString) and 
(ThirdName equals ThirdName or ThirdName equals EmptyString) and 
(ForthdName equals ForthName or ForthdName equals EmptyString) and 

实际上如果SecondName,ThirdName,ForthName不为空,并且不匹配,那么该行会不返回,因为它不匹配,不是空的。

public class One 
{ 
    public static List<Laborer> getLaborerByName(int? laborOfficeNo, long? componyNo, string firstName, string secondName, string thirdName, string fourthName) 
    { 
     var queryGetLaborerByName = (from c in db.Compny 
            join x in db.Laborer on c.PK_componyId equals x.FK_componyId 
            where c.SequenceNumber == componyNo 
             && c.FK_LaborOfficeId == laborOfficeNo 
             && c.FirstName.Equals(firstName) // Force First Name match 
             && (c.SecondName.Equals(secondName) || String.IsNullOrEmpty(c.SecondName) // Accepts SecondName Match or SecondName is EmptyString 
             && (c.ThirdName.Equals(thirdName) || String.IsNullOrEmpty(c.ThirdName) // Accepts ThirdName Match or ThirdName is EmptyString 
             && (c.ForthNameName.Equals(forthName) || String.IsNullOrEmpty(c.ForthName) // Accepts ForthName Match or ForthName is EmptyString                             
            select x); 

     return queryGetLaborerByName; 
    } 
} 

修订

public class One 
    { 
     public static List<Laborer> getLaborerByName(int? laborOfficeNo, long? componyNo, string firstName, string secondName, string thirdName, string fourthName) 
     { 
      var queryGetLaborerByName = (from c in db.Compny 
             join x in db.Laborer on c.PK_componyId equals x.FK_componyId 
             where c.SequenceNumber == componyNo 
              && c.FK_LaborOfficeId == laborOfficeNo 
              && c.FirstName.Equals(firstName) // Force First Name match 
              && (c.SecondName.Equals(secondName) || String.IsNullOrEmpty(secondName) // Accepts SecondName Match or SecondName is EmptyString 
              && (c.ThirdName.Equals(thirdName) || String.IsNullOrEmpty(thirdName) // Accepts ThirdName Match or ThirdName is EmptyString 
              && (c.ForthNameName.Equals(forthName) || String.IsNullOrEmpty(forthName) // Accepts ForthName Match or ForthName is EmptyString                             
             select x); 

      return queryGetLaborerByName; 
     } 
    } 
+0

感谢您的回答,但只接受输入全名的情况。不是其他情况。 – user3509742

+0

@ user3509742,进行了修订。我认为这应该起作用。我改变了条件,以便如果用户没有输入最后三个名字,它只会匹配名字。如果它们来回输入,则会忽略查询中的第二个和第三个名称。 – n4gy3

+0

谢谢,它的工作 – user3509742

0

注意:这不是一个尝试作为答案,但我真的不得不提到这一点。

你的代码目前

if (queryGetLaborerByName.ToList().Count > 0) 
{ 
    return queryGetLaborerByName.ToList(); 
} 

我强烈建议您结束与

return queryGetLaborerByName.ToList();

的方法,让被叫处理有没有集合中项的事实。调用.ToList()两次,再加上Count()的呼叫(使用Any()作为查找列表是否包含任何项目的替代方法,Count()将遍历每个单个项目,而Any()会在遇到第一个项目时停止)。