2016-01-10 2 views
2

У меня есть список параметров строк, и я хочу написать запрос, который возвращает список строк, содержащих значения списка параметров, которые присутствуют в таблице. У меня есть следующий запрос, но я не могу получить статью, где:Проверка наличия таблицы в списке

List<string> TheListParameter = new List<string>{"string1", "string2", "string3"}; 

var TheOutput = (from t in MyDC.SomeTable   
       where t.SomeColumn.Contains(TheListParameter) 
       select t.SomeColumn).ToList(); 

Как я пишу статью where для этого поискового запроса?

Спасибо.

+0

Я думаю, что на самом деле неправильно ваш вопрос ... Есть ли вам нужно 'SomeColumn' к * равной *' string1' или до * содержат * 'string1'? –

ответ

1

LINQ Oneliner

List<string> TheListParameter = new List<string>{"string1", "string2", "string3"}; 

var foundElements = MyDC.SomeTable.Where(a=> TheListParameter.Contains(a.SomeColumn)).Select(a=> a.SomeColumn); 

Почему все выбрасывают на ToList() рядом со мной. Все зависит от того, нужны ли вам все данные или нет.

Возьмите этот пример.

using(dbCtx myDc = new dbCtx()){ 
    var unrealizedList = myDc.someEntity; 
    var realizedList = myDc.someEntity.ToList(); 

    var a1 = unrealizedList.First() //Works 
    var b1 = realizedList.First() //Works 
} 
var a2 = unrealizedList.First() //Fails as unrealizedList is empty (not loaded and context is gone) 
var b2 = realizedList.First() //Works because the realizedList was loaded completely by the ToList() 

Теперь, если у вас есть глобальный или локальный (не используя) Ctx, то вы никогда бы не нужно ToList() хотя и с использованием using хороший и чистый способ получения контроля над контекст, который может быть проблемой, когда у вас есть несколько контекстов, работающих на eachother.

Крошечный указатель на ToList() средний запрос.

var a = myDc.someEntity.Where(a=> a.someDate.DayOfYear == 123); 
// Fails as DayOfYear cannot be translated to SQL expression 

Здесь нужно проецировать данные, прежде чем профильтровать, и, к сожалению, должен быть загружен все данные, чтобы сделать так

var a = myDc.someEntity.ToList().Where(a=> a.someDate.DayOfYear == 123); 
// Works as the data no longer is filtered in SQL (the SQL is "Select * from someEntity") 

Так что, если вы можете, выполнить вашу фильтрацию перед ToList() к ограничить объем данных, извлеченных из БД.

Вместо если ToList() вы можете использовать другие списки Aswell как ToArray()

1

Попробуйте следующие

List<string> TheListParameter = new List<string>{"string1", "string2", "string3"}; 

    var TheOutput = (from t in MyDC.SomeTable 
        where TheListParameter.Any(e => e == t.SomeColumn) 
        select t.SomeColumn).ToList(); 
1

на основе Contain «ы Documentation параметр для Contains может быть string не список строки. Так оно и должно быть, как это:

List<string> TheListParameter = new List<string> {"string1", "string2", "string3"}; 

var TheOutput = (from t in MyDC.SomeTable 
       where TheListParameter.Contains(t.SomeColumn.ToString()) 
       select t.SomeColumn).ToList(); 

Или, если вы хотите, чтобы вернуть логический результат, если MyDC.SomeTable.SomeColumn содержит одну из струн TheListParameter «s вы можете попробовать что-то вроде этого:

bool hasSameElements = MyDC.SomeTable.ToList() 
         .Select(c => c.SomeColumn) 
         .Intersect(TheListParameter).Any(); //True or False 
0

Попробуйте это:

List<string> TheListParameter = new List<string>{"string1", "string2", "string3"}; 
var result = MyDC.SomeTable.ToList().Select(l => l.SomeColumn) 
          .Where(l =>TheListParameter.Contains(l.SomeColumn)).ToList(); 
Смежные вопросы