2010-08-13 2 views
7

Я новичок с IQueryable, лямбда-выражениями и LINQ в целом. Я хотел бы поставить подзапрос в предложении где, как это:Подзапрос LINQ IN

код примера:

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?

ответ

12
var innerquery = from x in context.DataDictVal 
       where x.TbiTableName == myTableNameVariable 
        && x.DdColumnName == "Status" 
        && x.DdbColumnValLangDsc1.StartsWith("ac") 
       select x.DdvColumnVal; 

var query = from c in context.Client 
      where innerquery.Contains(c.Etat) 
      select c; 
+0

У нас есть победитель! Спасибо большое kbrimington. Хотя бы хотелось бы узнать немного больше. чтение предложений о LINQ, IQueryable и лямбда-выражениях ... Еще раз спасибо! –

+0

Хотя это не помогло бы с этим точным сценарием, я получил много пробега от чтения этих примеров: http://msdn.microsoft.com/en-us /vcsharp/aa336746.aspx. Я также многому научился из серии Скотта Гу из Linq-to-SQL: http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql -part-1.aspx – kbrimington

+0

Для меня это не работает.Contains (column) создает EXISTS(), который не совпадает с IN(). Я пытался сделать это в своем проекте и потому, что он создает EXISTS() Я получаю около 700 возвращенных строк. – ScubaSteve

1

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

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

+0

Спасибо! У меня уже есть LinqPad, теперь я получу Linqer. –

4
from c in db.Client 
where (from d in db.DataDictVal 
     where d.TblTableName == "Client" 
     && d.DDColumnName == "Status" 
     && dd.DdvColumnValLandDsc1.StartsWith("ac")) 
     .Contains(c.Etat) 
select c; 
+0

:(Вы вводите слишком быстро! –

+0

FYI: вам не хватает выражения выбора во внутреннем запросе. – kbrimington

0

же пример с использованием метода 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)) 

Примечание:

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

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

+1

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

+0

yup, я добавлю это сейчас, для тех, кто обычно использует синтаксис метода linq .hope, он может быть им полезен –

+0

Да, но В этом случае преобразование не является ракетой. Но опять же, синтаксис неверен (в нижнем регистре). –

Смежные вопросы