我有以下方法:
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中以干净的方式完成它。我希望我知道路。感谢到目前为止的所有回复。
答案 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;将它们组合在一起。