У меня есть следующий класс
public class Account
{
IEnumerable<AccountData> Data { get; set; }
}
где AccountData
public class AccountData
{
public virtual long Id { get; set; }
public virtual AccountTag AccountTag { get; set; }
public virtual string Value { get; set; }
}
и где тег учетной записи
public class AccountTag
{
public virtual long Id { get; set; }
public virtual string Name { get; set; }
}
Я хочу вернуть все учетные записи, где поле данных находится в списке пар ключ-значение. long — это AccountTag.Id, а AccountData.Value содержит строку
Вот что у меня есть до сих пор, но это выполняется на веб-сервере, и могут быть возвращены тысячи учетных записей, поэтому я ищу версию linq to sql.
public IEnumerable<Account> FindByCompanyDataTags(long companyId, IEnumerable<KeyValuePair<long, string>> tags)
{
var tempAccounts = (from acc in this.Data where acc.Company.Id == companyId orderby acc.Name select acc);
IList<Account> accounts = new List<Account>();
foreach (var account in tempAccounts)
{
var matches = true;
foreach (var t in tags)
{
if (account.Data.Any(x => x.AccountTag.Id == t.Key && x.Value.Contains(t.Value)))
{
continue;
}
matches = false;
break;
}
if (matches)
{
accounts.Add(account);
}
}
return accounts;
}
Если я использую resharper для преобразования этого в выражение linq, я получаю следующее
public IEnumerable<Account> FindByCompanyDataTags(long companyId, IEnumerable<KeyValuePair<long, string>> tags)
{
var tempAccounts = (from acc in this.Data where acc.Company.Id == companyId orderby acc.Name select acc);
IList<Account> accounts = (from account in tempAccounts let matches = tags.All(t => account.Data.Any(x => x.AccountTag.Id == t.Key && x.Value.Contains(t.Value))) where matches select account).ToList();
return accounts;
}
Но когда я запускаю это, я получаю исключение, не поддерживаемое методом.
Это действительно сбивает меня с толку, есть предложения?