DataTable.Select, используя оператор IN - PullRequest
0 голосов
/ 28 июля 2010

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

Есть ли способ использовать оператор 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 для наборов данных и т. Д. Чего мне действительно нужно избегать, так это многих поездок на сервер.

Ответы [ 2 ]

1 голос
/ 28 июля 2010
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 голосов
/ 28 июля 2010

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

SELECT A.SomeValue 
FROM Table1 A
RIGHT JOIN Table2 B
ON A.MyField = B.SomeField
WHERE B.SomeColumn = SomeFilterVariable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...