Entity Framework - условие присоединения «один ко многим» (лямбда) - PullRequest
0 голосов
/ 07 мая 2010

У меня есть 2 сущности: клиент и учетная запись, где клиент может иметь несколько учетных записей.В учетной записи у меня есть поле «PlatformTypeId», которое мне необходимо обуславливать (несколько значений), среди прочих критериев.Я использую лямбда-выражения, чтобы построить запрос.Вот фрагмент:

var customerQuery =
    from c in context.CustomerSet.Include("Accounts")
    select c;

if (criterions.UserTypes != null && criterions.UserTypes.Count() > 0)
{
    List<short> searchCriterionsUserTypes = 
        criterions.UserTypes.Select(i => (short)i).ToList();

    customerQuery = customerQuery
        .Where(LinqTools.BuildContainsExpression<Customer, short>(
            c => c.UserTypeId, searchCriterionsUserTypes));
}

// Other criterions, including the problematic platforms condition (below)
var customers = customerQuery.ToList();

Я не могу понять, как построить условие платформ учетных записей:

if (criterions.Platforms != null && criterions.Platforms.Count() > 0)
{
    List<short> searchCriterionsPlatforms =
        criterions.Platforms.Select(i => (short)i).ToList();

    customerQuery = customerQuery.Where(c => c.Accounts
        .Where(LinqTools.BuildContainsExpression<Account, short>(
            a => a.PlatformTypeId, searchCriterionsPlatforms)));
}

(BuildContainsExpression - метод, который мы используем для построения выражения длямножественный выбор)

Я получаю ошибку компиляции:

Аргументы типа для метода 'System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable, System.Func) 'не может быть выведено из использования.Попробуйте явно указать аргументы типа.

Есть идеи, как это исправить?

Спасибо,

Nir.

1 Ответ

0 голосов
/ 08 мая 2010

Я думаю, что это может помочь вам.

if (criterions.Platforms != null && criterions.Platforms.Count() > 0) 
{ 
    List<short> searchCriterionsPlatforms = 
        criterions.Platforms.Select(i => (short)i).ToList(); 

    customerQuery = customerQuery 
        .Where(c => c.Accounts  
                     .Any(a => searchCriterionsPlatforms 
                               .Contains(a.PlatformTypeId) 
                         )
              );        
} 

Это отфильтрует клиентов, у которых есть учетная запись, чей platfortypeid содержится в списке searchCriterionsPlatforms .

HTH

пс.

Вы можете изменить:

customerQuery = customerQuery 
    .Where(LinqTools.BuildContainsExpression<Customer, short>( 
        c => c.UserTypeId, searchCriterionsUserTypes)); 

на:

customerQuery = customerQuery
                .Where(c => searchCriterionsUserTypes.Contains(c.UserTypeId));

ИМО, что намного чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...