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

Linq包含返回所有项或选定项

您是否尝试过"存储"查询并在稍后的步骤中过滤它,如:

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;