2012-03-14 4 views
1

Я пытаюсь подражать под оператором в Linq to SQL.Linq to SQL - Query

WHERE (rtrim(posid) like '%101' or rtrim(posid) like '%532') 

I утверждение в основном определяют, если posid заканчивается 101 или 532. В приведенном выше примере я только делает 2 сравнения, но их может быть от 1 до N сравнения все вместе с OR. Я сохраняю значения сравнения (101,532, ...) в общем списке, который я отправляю на мой метод Linq to SQL.

Я пытался имитировать выше SQL, используя ИНЕКЕ неудачно (пример ниже):

var PosNum = new List<string>(); 
PosNum.Add("101"); 
PosNum.Add("532"); 
var q = (from a in context.tbl_sspos select a); 
q = q.Where(p => PosNum.Contains(p.posid.Trim())); 

Проблема с выше, где положение в том, что он пытается сделать точное совпадение, а Я хочу концы с сравнения.

Как мне подражать инструкции SQL в Linq to SQL. Благодарим вас за любую помощь/советы, которые вы можете предоставить.

+0

Это дубликат http://stackoverflow.com/questions/835790/how-to-do-sql-like-in-linq –

ответ

0

В EF 4 вы можете использовать методы StartsWith/EndsWith сейчас. Может также работать в LINQ to SQL.

UPDATE
Просто понял, что вы пытаетесь TODO это против нескольких значений (PosNum), я не думаю, что это напрямую поддерживается в настоящее время. Однако вы можете конкатенировать несколько статей Where(), чтобы получить результат.

UPDATE 2
Как AdamKing отметил конкатенации, где пункты были фильтрование против всех PosNum значений, вот исправленная версия:

var baseQuery = (from a in context.tbl_sspos select a);  
IEnumerable<YourType> q = null; 

foreach(var pos in PosNum) 
{ 
    if(q == null) 
     q = baseQuery.Where(a => a.posid.EndsWith(pos)); 
    else 
     q = q.Union(baseQuery.Where(a => a.posid.EndsWith(pos))); 
} 

Это не так хороша, больше, но работает, тем не менее.

+0

У вас есть пример для конкатенации нескольких пунктов Where() – Victor

+0

Этот пример не имеет желаемого эффекта? В верхней части моей головы вы будете искать только результаты, которые заканчиваются во всех членах PosNum, т. Е. Нет? – KingCronus

+0

Образец делает именно это, он объединяет предложение 'Where()' путем переназначения q в 'foreach' – ntziolis

1

Я хотел бы использовать String.EndsWith();

Это будет проверять конец строки, а не все содержимое этого.

var q = (from a in context.tbl_sspos select a); 
q = q.Where(p => p.posid.EndsWith("102") || p.posid.EndsWith("532")); 
+0

Как? Можете ли вы показать пример? – Victor

+0

Сколько у вас PosNums? Выполнение этого способа не будет хорошо масштабироваться. – KingCronus

+0

Извините, я не могу найти метод EndsWith в общем списке. – Victor