c#处理所有可能的null和非null值

时间:2010-07-07 16:17:23

标签: c# linq

我有以下方法:

public IQueryable<Profile> FindAllProfiles(string CountryFrom, string CountryLoc)
{
    return db.Profiles.Where(p => p.CountryFrom.CountryName.Equals(CountryFrom,
        StringComparison.OrdinalIgnoreCase));
}

编写 where 子句的最佳方法是在一个语句中过滤所有可能的输入参数组合:

CountryFrom和CountryLoc = null

只有CountryFrom null

只有CountryLoc null

同时CountryFrom和CountryLoc不为空。

很快......我需要按年龄,性别,专业过滤掉个人资料......你可以这么说。

我试图找到一种在C#中有效编写它的方法。我知道如何在TSQL中以干净的方式完成它。我希望我知道路。感谢到目前为止的所有回复。

5 个答案:

答案 0 :(得分:2)

一个好的旧二进制XNOR操作将在这里做到这一点:

db.Profiles.Where(p => !(p.CountryFrom == null ^ p.CountryTo == null))

它有效地将两个布尔等同起来,虽然对我来说它比写((p.CountryFrom == null) == (p.CountryTo == null))更直接,更复杂!

答案 1 :(得分:0)

我不会称之为优雅:

public IQueryable<Profile> FindAllProfiles(string CountryFrom, string CountryLoc)
{
    return db.Profiles.Where(p =>
        {
            p.ContryFrom != null &&
            p.CountryFrom.CountryName != null &&
            p.CountryFrom.CountryName.Equals(CountryFrom, StringComparison.OrdinalIgnoreCase)
        });
}

答案 2 :(得分:0)

我会使用这个简单的LINQ语法......

CountryFrom和CountryLoc = null

var result = from db.Profiles select p
             where (p.CountryFrom == null) && (p.CountryLoc == null)
             select p

只有CountryFrom null

var result = from db.Profiles select p
             where (p.CountryFrom == null) && (p.CountryLoc != null)
             select p

只有CountryLoc null

var result = from db.Profiles select p
             where (p.CountryFrom != null) && (p.CountryLoc == null)
             select p

同时CountryFrom和CountryLoc不为空。

var result = from db.Profiles select p
             where (p.CountryFrom != null) && (p.CountryLoc != null)
             select p

希望它有所帮助; - )

答案 3 :(得分:0)

我赞成不试图将过多的逻辑塞入linq表达式中。为什么不在这样的单独函数中包含比较逻辑呢?

编辑:我提供了MatchesCountry函数的示例实现。

class Example
{
    public IQueryable<Profile> FindAllProfiles(string CountryFrom, string CountryLoc)
    {
        return db.Profiles.Where(p => p.MatchesCountry(CountryFrom, CountryLoc));
    }
}

public static class ProfileExtensions
{
    public static bool MatchesCountry(this Profile profile, string CountryFrom, string CountryLoc)
    {
        // NOTE: Your comparison logic goes here.  Below is an example implementation

        // if the CountryFrom parameter was specified and matches the profile's CountryName property
        if(!string.IsNullOrEmpty(CountryFrom) && string.Equals(profile.CountryName, CountryFrom, StringComparison.OrdinalIgnoreCase))
            return true; // then a match is found

        // if the CountryLoc parameter was specified and matches the profile's CountryCode property
        if (!string.IsNullOrEmpty(CountryLoc) && string.Equals(profile.CountryCode, CountryLoc, StringComparison.OrdinalIgnoreCase))
            return true; // then a match is found

        // otherwise, no match was found
        return false;
    }
}

答案 4 :(得分:0)

我可能遗漏了一些东西,但是正如所写的,你的运算符组合要么让所有值通过,要么没有值,这取决于你是否使用||或者&amp;&amp;将它们组合在一起。