2015-10-06 2 views
0

У меня есть этот LINQ:Создание LINQ с тем, где статья

private static object getObjectModels(DbContext context, IQueryable<int> contractsID) 
    { 
     return (from objectModel in context.Set<ObjectModel>() 
       where "column named conId contains contractsID " 
       select new ContractHelper 
       { 
        Id = contract.Id, 
        ClientId = contract.ClientId, 
       }); 
    } 

нужно выбрать из записей таблицы, где столбец с именем conID имеют значения contractsID.

Контракт ID - это массив int. Обозначение столбца intID.

Что я пишу в этой строке: где «column с именем conId содержит contractID» , чтобы получить все записи, в которых идентификатор столбца имеет элемент, равный элементу в массиве contractID?

+2

Вам нужно реплицировать 'пункт в': [http://stackoverflow.com/questions /959752/where-in-clause-in-linq](http://stackoverflow.com/questions/959752/where-in-clause-in-linq) – markpsmith

ответ

4

Вы можете быть в состоянии инвертировать, где положение и использовать «содержит», например:

private static object getObjectModels(DbContext context, IQueryable<int> contractsID) 
    { 
     return (from objectModel in context.Set<ObjectModel>() 
       where objectModel.conId.HasValue && contractsID.Contains(objectModel.conId) 
       select new ContractHelper 
       { 
        Id = contract.Id, 
        ClientId = contract.ClientId, 
       }); 
    } 

Вы, возможно, потребуется преобразовать IQueryable в список, однако.

var myIds = contractIDs.ToList(); 
... 
where myIds.Contains(objectModel.conId) 
... 
+0

Столбец objectModel.conId имеет значение NULL, поэтому я получаю ошибку, когда Itry to используйте ваш пример. Есть ли у вас возможности исправить это? – Michael

+0

Я обновлю свой ответ предложением, у меня нет проекта EF, чтобы его проверить, хотя! –

2

Вы можете пойти с Int массив, чтобы LINQ перевести на правильный В синтаксисе SQL

private static object getObjectModels(DbContext context, IQueryable<int> contractsID) 
    { 
     // Necessary to translate Contains to SQL IN CLAUSE 
     int [] contractIdsArray = contractsID.ToArray() ; 

     return (from objectModel in context.Set<ObjectModel>() 
       where contractIdsArray.Contains(objectModel.conId) 
       select new ContractHelper 
       { 
        Id = contract.Id, 
        ClientId = contract.ClientId, 
       }); 
    }