Linq.Where-to-SQL в текстовом поле по сравнению со списком значений - PullRequest
0 голосов
/ 06 апреля 2010

Customer.text - это поле в БД T-SQL (которое я не контролирую и, следовательно, не могу изменить) типа «текст».

Я хотел бы сделать что-то вроде этого:

List<string> compare = new List<string>();
compare.Add("one");
compare.Add("two");

var q = from t in customer
        where t.text.Contains( compare.First())
        select t;

это будет работать.

Но теперь я хотел бы сделать что-то вроде: (! НЕ РАБОТАЕТ!)

var q = from t in customer
        where compare.Contains( t.text )
        select t;

Как мне этого добиться?Это вообще возможно?

РЕДАКТИРОВАТЬ: Проблема, очевидно, не совсем ясна: текстовый столбец в SQL не может быть запрошен с помощью «=», но только с LIKE.Таким образом, сравнение. Содержит (t.text) приведет к ошибке, поскольку он преобразуется в запрос с использованием "=".

То, что я не сказал - я думал, что это не имеет значения - это то, что яиспользуйте LINQ-to-ORM (в этом случае LLBLGen).Вместо этого я попробовал:

var q = from t in customer
        where compare.Any( x => t.text.Contains(x) )
        select t;

Теперь это тоже не сработало.В настоящее время я не на работе, но за исключением того, что ConstantExpression не может быть преобразовано в SetExpression.

Надеюсь, это дало некоторые пояснения.

EDIT2:

Джозеф указал мне на это: PredicateBuilder .Создает Expression для данного ObjectType.Теперь моя проблема в том, что мой тип является анонимным типом из нескольких соединений.Есть ли простой или элегантный способ справиться с этим?

Ответы [ 3 ]

1 голос
/ 06 апреля 2010

Вы можете создать свой запрос, используя бесплатный класс построения предикатов LinqKit. Вот запись в блоге, которая описывает его использование и содержит ссылку на сайт загрузки.

http://thecodeslinger.wordpress.com/2008/10/28/linqkit-predicatebuildert-goodness/

Ниже приведен пример кода из поста

    //First get a list of keywords that match the description entered.
                string[] parts = txtInclude.Text.Split(new[] {‘ ‘});
                string[] noparts = null;
                if(txtButNot.Text.Trim().Length > 0)
                    noparts = txtExclude.Text.Trim().Split(new[] {‘ ‘});

                var pred = PredicateBuilder.True<Pet>();
   //here is where you would loop through your compare object
                parts.ForEach(p => pred = pred.And(pl => pl.description.Contains(p)));
                if(noparts != null)
                    noparts.ForEach(p => pred = pred.And(pl => !pl.description.Contains(p)));

                var pets = from s in db.Pets.Where(pred)
                        select s;
1 голос
/ 06 апреля 2010

Теперь я могу что-то упустить, но ваш код выглядит так, как будто он должен работать.Вы включили пространства имен вверху файла?

using System.Linq;
using System.Linq.Expressions;

Вы также можете переписать его без синтаксиса Linq2Sql, например:

var q = customer.Where(c => compare.Contains(c.text));
0 голосов
/ 06 апреля 2010

Вы должны преобразовать текстовое поле в строку

        var query = from t in dataContext.table
                    where compare.Contains(t.textField.ToString())
                    select t;
...