Где IN IN в LINQ [дубликат]

На этот вопрос уже есть ответ здесь:

Linq to Entities - предложение SQL «IN» 8 ответов

Как сделать предложение where in похожим на предложение в SQL Server?

Я сделал один сам, но может кто-нибудь улучшить это?

    public List<State> Wherein(string listofcountrycodes)
    {
        string[] countrycode = null;
        countrycode = listofcountrycodes.Split(',');
        List<State> statelist = new List<State>();

        for (int i = 0; i < countrycode.Length; i++)
        {
            _states.AddRange(
                 from states in _objdatasources.StateList()
                 where states.CountryCode == countrycode[i].ToString()
                 select new State
                 {
                    StateName  = states.StateName                    

                 });
        }
        return _states;
    }

Ответы на вопрос(8)

from state in _objedatasource.StateList()
where listofcountrycodes.Contains(state.CountryCode)
select state

Мне нравится это как метод расширения:

public static bool In<T>(this T source, params T[] list)
{
    return list.Contains(source);
}

Теперь вы звоните:

var states = _objdatasources.StateList().Where(s => s.In(countrycodes));

Вы также можете передавать отдельные значения:

var states = tooManyStates.Where(s => s.In("x", "y", "z"));

Чувствует себя более естественно и ближе к sql.

 nawfal27 янв. 2016 г., 12:15
@Jurg Это довольно часто требуется, нет? Я пользуюсь этим все время. Отлично работает для Linq to Objects, еще не пробовал для IQueryables.
 nawfal04 февр. 2014 г., 18:24
@Rohaan, в любом статическом классе (который не является общим и не вложенным)
 JARRRRG27 янв. 2016 г., 13:07
Не то, что я имел в виду, это часто используется наверняка, однако, в конкретном проекте, если вам нужно сделать это, скажем, один контроллер (иначе один раз), то есть метод расширения не требуется. Это было больше для людей, которые плохо знакомы с c # / linq :)
 Rohaan04 февр. 2014 г., 06:46
где я должен написать этот метод расширения
 JARRRRG27 янв. 2016 г., 11:09
В написании класса расширения есть только расстояние, если вы собираетесь повторно использовать часть Where в вашем linq. Проголосовал ответ, но просто хотел, чтобы другие, кто сталкивался с этим вопросом, шли прямо по пути расширения метода.
Решение Вопроса

что вы хотите достичь.

dataSource.StateList.Where(s => countryCodes.Contains(s.CountryCode))
 Jitendra Pancholi22 февр. 2013 г., 08:32
это будет сравнивать строковые значения, но как насчет идентификаторов ??
 Rashmi Pandit10 июн. 2014 г., 07:16
@JitendraPancholi, если вы создаете список <int>, вы можете проверить наличие идентификаторов. Он поддерживается в .Net 4. Не уверен в более ранних версиях.

Например, чтобы получить всех людей, чьи .States's "NY" или "FL":

using (DataContext dc = new DataContext("connectionstring"))
{
    List<string> states = new List<string>(){"NY", "FL"};
    List<Person> list = (from p in dc.GetTable<Person>() where states.Contains(p.State) select p).ToList();
}

Это переведет к предложению where в Linq для SQL ...

var myInClause = new string[] {"One", "Two", "Three"};

var results = from x in MyTable
              where myInClause.Contains(x.SomeColumn)
              select x;
// OR
var results = MyTable.Where(x => myInClause.Contains(x.SomeColumn));

В случае вашего запроса вы можете сделать что-то вроде этого ...

var results = from states in _objectdatasource.StateList()
              where listofcountrycodes.Contains(states.CountryCode)
              select new State
              {
                  StateName = states.StateName
              };
// OR
var results = _objectdatasource.StateList()
                  .Where(s => listofcountrycodes.Contains(s.CountryCode))
                  .Select(s => new State { StateName = s.StateName});
 Thiago Loureiro31 авг. 2017 г., 16:42
Спасибо;) Мне тоже помог +1

одзапрос внутри основного запроса linq.

Проблема:

Допустим, у нас есть таблица документов. Схема выглядит следующим образом:документ (название, версия, Автор развивает, ModifiedDate) составные ключи: имя, версия

Поэтому нам нужно получить последние версии всех документов.

soloution

 var result = (from t in Context.document
                          where ((from tt in Context.document where t.Name == tt.Name
                                orderby tt.Version descending select new {Vesion=tt.Version}).FirstOrDefault()).Vesion.Contains(t.Version)
                          select t).ToList();
public List<State> GetcountryCodeStates(List<string> countryCodes)
{
    List<State> states = new List<State>();
    states = (from a in _objdatasources.StateList.AsEnumerable()
    where countryCodes.Any(c => c.Contains(a.CountryCode))
    select a).ToList();
    return states;
}
 ForceMagic13 нояб. 2012 г., 20:05
Добро пожаловать на SO, здесь хорошая практика, чтобы объяснить, почему использовать ваше решение, а не просто как. Это сделает ваш ответ более ценным и поможет дальнейшему читателю лучше понять, как вы это делаете. Я также предлагаю вам посмотреть наш FAQ:stackoverflow.com/faq.
public List<Requirement> listInquiryLogged()
{
    using (DataClassesDataContext dt = new DataClassesDataContext(System.Configuration.ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString))
    {
        var inq = new int[] {1683,1684,1685,1686,1687,1688,1688,1689,1690,1691,1692,1693};
        var result = from Q in dt.Requirements
                     where inq.Contains(Q.ID)
                     orderby Q.Description
                     select Q;

        return result.ToList<Requirement>();
    }
}
 Vahid Ghadiri12 июн. 2018 г., 10:55
Что такое синтаксис метода эквивалентности?

Ваш ответ на вопрос