2012-01-22 2 views
0

Можно создать дубликат:
'Contains()' workaround using Linq to Entities?LINQ не принимает Содержит()

Использование LINQ в C#, у меня есть следующая проблема;

нужно выбрать строки из большой таблицы, используя 3 условие: - «schooljaar» должен быть значение, установленное ранее, - «p_bamatype» должен быть значение NOT в списке, определенном в настройках (это StringCollection) - «p_stdgeb» должно быть значение NOT в списке, определенном в настройках (это также StringCollection)

у меня есть этот код:

var set = (db.SA_Opleiding.Where(opleiding => opleiding.schooljaar == schooljaar 
           && 
           !Properties.Settings.Default.Admin_Studiegebieden_Exclude.Cast 
                  <string>().ToList().Contains(
                   opleiding.p_stdgeb.ToString()) 
           && 
           !Properties.Settings.Default.Admin_Studietypes_Exclude.Cast 
                  <string>().ToList().Contains(
                   opleiding.p_bamatype.ToString())) 
          .Select(opleiding => new OpleidingModel() 
            { 
             Id = opleiding.p_opleiding, 
             LanNames = 
              new Dictionary 
              <string, string>() 
               { 
                { 
                 "NL", 
                 opleiding. 
                 opleidingNL 
                 }, 
                { 
                 "FR", 
                 opleiding. 
                 opleidingFR 
                 }, 
                { 
                 "EN", 
                 opleiding. 
                 opleidingEN 
                 } 
               } 
            })) 
         .ToList<OpleidingModel>(); 

     return set; 

Однако, LINQ не удается преобразовать Метод Содержит. Я читал о других, имеющих одну и ту же проблему, но я не могу найти подходящего решения для этого. Есть ли какое-либо решение для описанной проблемы? Так что я точно нуждаюсь в NOT IN (набор строк) эквивалент LINQ.

+0

[Вот] (http://stackoverflow.com/questions/88473/how-to-do-a-where-in-values-in-linq -to-entities-3-5) один из многих возможных дубликатов. –

ответ

2

Если один из различных дубликатов ответов не помогает, here is a link тому, который может. Он ссылается на расширение до Linq-to-entity:

public static class QueryExtensions 
{ 
    public static IQueryable<TEntity> WhereIn<TEntity, TValue> 
    (
     this ObjectQuery<TEntity> query, 
     Expression<Func<TEntity, TValue>> selector, 
     IEnumerable<TValue> collection 
    ) 
    { 
     ParameterExpression p = selector.Parameters.Single(); 

     //if there are no elements to the WHERE clause, 
     //we want no matches: 
     if (!collection.Any()) return query.Where(x=>false); 

     if (collection.Count() > 3000) //could move this value to config 
      throw new ArgumentException("Collection too large - execution will cause stack overflow", "collection"); 

     IEnumerable<Expression> equals = collection.Select(value => 
      (Expression)Expression.Equal(selector.Body, 
       Expression.Constant(value, typeof(TValue)))); 

     Expression body = equals.Aggregate((accumulate, equal) => 
      Expression.Or(accumulate, equal)); 

     return query.Where(Expression.Lambda<Func<TEntity, bool>>(body, p)); 
    } 
} 

Есть несколько других подобных товаров.

EDIT

я обеспечил контекст для кода выше, и здесь возможно использование:

db.SA_Opleiding.WhereIn(v => v.SomeCollection); 

Я никогда не использовал этот конкретный метод расширения, но все они в основном основанный на том же принципе.

+0

Спасибо за ваш ответ, но где я должен поставить этот код? – Mortana

+0

Предполагая, что вы используете .NET 3.5 (я считаю), в статическом классе, доступном из кода, который вы планируете выполнить. Для получения дополнительной информации обратитесь к [Методы расширения (Руководство по программированию на C#)] (http://msdn.microsoft.com/en-us/library/bb383977.aspx). –

+0

@Mortana - Я обновил свой ответ, чтобы включить полуреализованный контекст. –

0

Подходящий для меня метод .Any() для Contains(). Я заменил:

objListing.Contains(myObject) 

с

objListing.Any(x => x.Object.ID == myObject.ID)