有条件地为LINQ语句添加一个条件

时间:2014-05-20 12:34:01

标签: c# linq-to-entities

我有这样的事情:

public Assignments GetAssignmentsForProider(string provider_k, string recordType)
{
    if (recordType == "A")
    {
       var query = from ea in this.Context.Assignments
            where ea.Provider_K == provider_k
                  && ea.Active == true
                  && ea.RecordType == "A"
            select ea;
        return query.FirstOrDefault();
    }
    else if (recordType == "E")
    {
       var query = from ea in this.Context.Assignments
            where ea.Provider_K == provider_k
                  && ea.RecordType == "E"
            select ea;
        return query.FirstOrDefault();
    }
}

两个问题:

  1. 不编译!因为它也需要一个默认的返回语句而且我不确定要返回什么,但是在我的程序中,如果条件发生,它们将永远不会发生。我总是在第一个或第二个。

  2. 实际上他们所有的不同之处在于我们检查Active == true的第一个,而在第二个我们没有检查{{1}}。那么有更好的写作方式吗?

3 个答案:

答案 0 :(得分:2)

这样的东西?

public Assignments GetAssignmentsForProider(string provider_k, string recordType)
{
    var query = from ea in this.Context.Assignments
        where ea.Provider_K == provider_k
                && ea.RecordType == recordType
                && (recordType == "E" ? true : ea.Active)
            select ea;
        return query.FirstOrDefault();
}

这应该满足你的需要。

答案 1 :(得分:1)

我可能会这样写:

public Assignments GetAssignmentsForProider(string provider_k, string recordType)
{
    var query = from ea in this.Context.Assignments
                where ea.Provider_K == provider_k &&
                      ea.RecordType == recordType
                select ea;

    if (recordType == "A")
        return query.Where(ea => ea.Active).FirstOrDefault();
    else if (recordType == "E")
        return query.FirstOrDefault();

    return null;
}

答案 2 :(得分:1)

链接你的条件的一种方法......

public Assignments GetAssignmentsForProider(string provider_k, string recordType)
{
    var query = from ea in this.Context.Assignments
                where ea.Provider_K == provider_k
                select ea;

    if (recordType == "A")
    {
       query = from q in query
               where q.Active == true
                  && q.RecordType == "A"
               select q;
    }
    else if (recordType == "E")
    {
       query = from q in query
               where q.RecordType == "E"
               select q;    
    }

    return query;
}

但是BjarkeSøgaard有更好的方法来过滤记录类型,因为你的标准参数直接匹配查询数据......所以你可以直接使用它。