Подзапрос LINQ IN

Я новичок в IQueryable, лямбда-выражениях и LINQ в целом. Я хотел бы поместить подзапрос в предложение where следующим образом:

Образец кода :

SELECT * FROM CLIENT c WHERE c.ETAT IN (
 SELECT DDV_COLUMN_VAL FROM DATA_DICT_VAL
 WHERE TBI_TABLE_NAME = 'CLIENT' AND DD_COLUMN_NAME = 'STATUS'
           AND DDV_COLUMN_VAL_LANG_DSC_1 LIKE ('ac%'))

Как перевести это в LINQ?


person Patrice Cote    schedule 13.08.2010    source источник


Ответы (4)


Если вы новичок в Linq, вам абсолютно необходимы два основных инструмента. Первый — это инструмент, который преобразует большинство операторов T-SQL в язык Linq, называемый Linqer (http://www.sqltolinq.com/). Это должно позаботиться о запросе в вашем вопросе. Другой инструмент — LinqPad (http://www.linqpad.net/). Это поможет вам изучить Linq, когда вы будете практиковаться с запросами.

Я часто использую Linqer для преобразования запроса T-SQL, а затем использую LinqPad для его точной настройки.

person Randy Minder    schedule 13.08.2010

Тот же пример с синтаксисом метода Linq:

var innerquery =  dbcontext.DataDictVal                  
                 .where(x=> x.TbiTableName == myTableNameVariable
                    && x.DdColumnName == "Status"
                    && x.DdbColumnValLangDsc1.StartsWith("ac"))
                 .select(x=>x.DdvColumnVal)

var query = dbcontext.Client
            .where( c=>innerquery.Contains(c.Etat))

Примечание.

Я предоставляю этот ответ, потому что, когда я искал ответ, я не смог найти много ответов, объясняющих ту же концепцию в синтаксисе метода.

Так что в будущем это может быть полезно для людей, которые сегодня внутренне искали синтаксис метода, как я. спасибо Картик

person Karthik Elumalai    schedule 17.05.2017
comment
Я не думаю, что это необходимо, но, по крайней мере, вы могли бы сделать это синтаксически правильным - person Gert Arnold; 17.05.2017
comment
да, я добавляю это сейчас для тех, кто обычно использует синтаксис метода linq. Надеюсь, это может быть полезно для них. - person Karthik Elumalai; 17.05.2017
comment
Да, но в данном случае конверсия - это не ракетостроение. Но опять же, синтаксис неверен (нижний регистр). - person Gert Arnold; 17.05.2017

person    schedule
comment
У нас есть победитель! Большое спасибо kbrimington. Хотя хотелось бы немного больше понять. Не могли бы вы дать несколько полезных советов по чтению о LINQ, IQueryable и лямбда-выражениях? Спасибо еще раз ! - person Patrice Cote; 13.08.2010
comment
Хотя это не помогло бы именно в этом сценарии, я получил много пользы от чтения этих примеров: msdn.microsoft.com/en-us/vcsharp/aa336746.aspx. Я также многому научился из серии статей Скотта Гу о Linq-to-SQL: weblogs.asp.net/scottgu/archive/2007/05/19/ - person kbrimington; 13.08.2010
comment
Для меня это не работает. .Contains(столбец) создает EXISTS(), который отличается от IN(). Я пытался сделать это в своем проекте, и поскольку он создает EXISTS(), я получаю еще около 700 строк. - person ScubaSteve; 23.07.2012
comment
Не будет работать с запросом Dynamic Linq, который возвращает IQueryable. Для IQueryable не существует метода Contains или метода расширения. - person Triynko; 25.09.2015
comment
@Triyko, конечно, это работает с динамическими запросами. Вероятно, вам не хватает оператора using. Метод расширения, на который вы ссылаетесь, это System.Linq.Queryable.Contains<TSource>(this IQueryable<TSource> source, TSource item);. Если ваш динамический запрос возвращает неуниверсальное IQueryable, то вы правы; хотя сейчас мы находимся в сфере, далекой от того, о чем спрашивал ОП. - person kbrimington; 25.09.2015

person    schedule
comment
К вашему сведению: вам не хватает выражения выбора во внутреннем запросе. - person kbrimington; 13.08.2010