2010-07-28 5 views
0

Я никогда не находил изящный способ сделать это, поэтому мне интересно, какие методы предпочитают другие разработчики (для производительности, удобочитаемости и т. Д.).DataTable.Select using оператор IN

Есть ли способ использовать оператор LIKE в функции DataTable.Select(), основываясь на результатах запроса на другой DataTable. Например, в SQL Server, синтаксис будет:

Select SomeValue 
From Table1 
WHERE MyField IN 
    (Select SomeField From Table2 Where SomeColumn = SomeFilterVariable) 

Я знаю, что с точки зрения кодирования, это очень простой запрос, чтобы сделать против БД, но это делается в приложении, где это делать этот способ привел бы к сотням тысяч вызовов на сервер из-за количества используемых вычислений. Я приурочил его, и гораздо лучше сразу получить все данные и использовать DataTable.Select() или DataTable.Compute(), чтобы получить нужные мне результаты.

Я открыт для чего угодно, включая LINQ для наборов данных и т. Д. Чего мне действительно нужно избегать, это много поездок на сервер.

ответ

1
from t1 in db.Table1 
where (from t2 in db.Table2 where t2.SomeColumn = SomeFilterVariable select t2.SomeField).Contains(t1.MyField) 
select t1.SomeValue; 

Если это слишком грязно для вас:

var subQ = from t2 in db.Table2 
      where t2.SomeColumn = SomeFilterVariable 
      select t2.SomeField; 

var query = from t1 in db.Table1 
      where subQ.Contains(t1.MyField) 
      select t1.SomeValue; 

Отличная вещь здесь является способ LINQ работает, что будет строить & выполнить только один SQL заявление, в основном так же, как SQL, который вы опубликовали.

+0

Это будет идти на сервер, чтобы выполнить это, правда? Я специально стараюсь избегать поездок на сервер БД и вместо этого сначала получать данные (целые таблицы), а затем выполнять подобные запросы против встроенной памяти DataTable (часть DataSet). Хотя я проголосую за хороший синтаксис Linq, который я мог бы использовать в другой ситуации, когда ограничение производительности при поездках по DB не так ужасающе. – David

+0

Он пойдет в базу данных, если коллекции (db.Table1 & db.Table2) являются объектами таблицы. Если они собираются в regaulr, они будут работать в памяти. Синтаксис должен оставаться неизменным. –

+0

Вы правы ... Спасибо. – David

0

С приведенным выше примером, я думаю, вы могли бы использовать RIGHT JOIN, чтобы получить нужные данные. Здесь:

SELECT A.SomeValue 
FROM Table1 A 
RIGHT JOIN Table2 B 
ON A.MyField = B.SomeField 
WHERE B.SomeColumn = SomeFilterVariable 
+0

Опять же, это идет к БД. Я хочу сделать это в наборе данных в памяти, который уже был заполнен из базы данных. – David

+0

Я думаю, если «исходные данные» не меняются, вы можете использовать некоторые временные таблицы данных и пары петель ... –

+0

Это не так. Это табулирует результаты опроса после крайнего срока опроса. Это метод, который я использую. Я искал что-то более чистое, но благодарю вас за то, что вы нашли время ответить. – David