Linq包含返回所有项或选定项
本文关键字:包含 返回 Linq | 更新日期: 2023-09-27 18:07:34
是否可以使用where子句编写linq select,该子句可以选择所有项或特定项?在SQL中,我可以使用"where currency like '%'"来返回所有内容。我正试图写一个方法,这样我就可以传递货币(在其他一些事情),并重复使用相同的方法。
。
是英镑
from a in accounts
where currency.Contains('GBP')
select a
是英镑
from a in accounts
where currency == 'GBP'
select a
所有货币?
from a in accounts
where currency like '%'
select a
您是否尝试过"存储"查询并在稍后的步骤中过滤它,如:
IEnumerable<AccountClass> GetAccounts(string filter = null)
{
var query = from a in accounts select a;
if (!string.IsNullOrEmpty(filter))
{
query = query.Where(a => a.Currency.Contains(filter));
}
return query;
}
这可以在单个查询中折叠,但对我来说似乎可读性较差,并且可能不适用于LINQ-to- sql(或其他LINQ-to-DB,其中表达式被转换为查询):
from a in accounts
where string.IsNullOrEmpty(filter) || a.Currency.Contains(filter)
select a
你可以试试
.Where(c => currencyToFind == null ? true : c==currencyToFind)
如果您想要所有的货币,则为您想要的货币传递null。
linq查询表达式:
from a in accounts
where (currencyToFind == null ? true : account.Currency==currencyToFind)
select a
如果您想返回所有货币,请不要使用任何where
(LINQ和SQL):
from a in accounts
select a
或者,如果您真的不需要做任何其他事情,只需使用accounts
。
EDIT:如果你想有一个方法,比如说,任何货币都是用null
表示的,你可以这样做:
IQueryable<Account> result = accounts;
if (currency != null)
result = result.Where(a => a.Currency == currency);
return result;
在没有更多信息的情况下很难回答这个问题,但是这里有一种您似乎想要的模式(在我的书中,除非确实有必要,否则这将是过度设计):
public static Expression<Func<Account, bool>> GetAccountCurrencyPredicate
(this FilterKind filter, string value)
{
switch (filter)
{
case FilterKind.Exact:
return account => account.Currency == value;
case FilterKind.Contains:
return account => account.Currency.Contains(value);
case FilterKind.All:
return account => true;
default:
throw new ArgumentException("Unknown FilterKind.", "filter");
}
}
然后使用:
FilterKind filter = ...
string value = ...
IQueryable<Account> accounts = ...
var predicate = filter.GetAccountCurrencyPredicate(value);
var matchingAccounts = accounts.Where(predicate);
你不能只过滤一个条件吗?
var selectedAccounts = accounts.Select(y => y);
if(!string.IsNullOrEmpty(currency))
{
selectedAccounts = selectedAccounts.Where(y => y.Currency.Contains(currency));
}
你甚至可以尝试一个更通用的版本:
IEnumerable<Account> GetAccounts(Func<Account, bool> filter)
{
var selectedAccounts = accounts.Select(y => y);
if(filter != null)
{
selectedAccounts = selectedAccounts.Where(filter);
}
return selectedAccounts;
}
IEnumerable<Account> GetAccountsForCurrency(string currency)
{
if(string.IsNullOrEmpty(currency))
{
return GetAccounts(null);
}
return GetAccounts((y) => y.Currency.Contains(currency));
}
现在您有了一个更具体和更通用的方法,可用于不同类型的过滤
如果您想返回任何东西,为什么要使用where
语句?where
是用来过滤的,所以如果你想返回任何东西,你可以尝试
from a in accounts
select a
或者,如果你想在其中加入where语句
from a in accounts
where 1 = 1
select a
或者,如果你想要一个类似的语句,我建议使用正则表达式
from a in accounts
let r = new Regex("expression")
where r.IsMatch(a.currency)
select a;