Ошибка при поиске строки, содержащей & - PullRequest
2 голосов
/ 12 апреля 2011

Я использую запрос linq для получения списка объектов, которые содержат переменную строку:

   string str = FilterAllSource;
                if (!string.IsNullOrEmpty(str))
                {
                    ss = ss.Where(it => (it.SourceCode.ToUpper()
                                               .Contains(str.ToUpper())
                                         || it.SourceName.ToUpper()
                                               .Contains(str.ToUpper())));
                }

                if (top > 0)
                    ss = ss.Take(top);

                return ss.ToList();

, когда FilterAllsource содержит & (например, m & m), он выдает исключение

Unterminated string literal at position 38 in '(ResourceId eq 3) and (substringof('M '.

Я предполагаю, что & вмешивается в некоторый процесс внутренней конкатенации.Есть ли способ избежать этого, не удаляя & из строки запроса?

EDIT1: ss - список объектов List, где SourceCode и Sourcename являются строками

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Это работает для меня ...

class Program
{
    static void Main(string[] args)
    {
        Program p = new Program();
        List<Test> list = p.GetList();
    }

    public List<Test> GetList()
    {
        List<Test> ss = new List<Test>();
        ss.Add(new Test("m & mm & mm & mm & mm & mm & mm & m", "m & mm & mm & mm & mm & mm & mm & m"));
        string str = "m & m";

        if (!string.IsNullOrEmpty(str)) 
        { 
            ss = ss.Where(it => (it.SourceCode.ToUpper().Contains(str.ToUpper()) || it.SourceName.ToUpper().Contains(str.ToUpper()))).ToList();
        } 

        //if (top > 0) 
        //{
        //    ss = ss.Take(top); 
        //}

        return ss.ToList(); 
    }
}

public class Test
{
    public Test(string sourceCode, string sourceName)
    {
        this.SourceCode = sourceCode;
    }

    public string SourceCode
    {
        get;
        set;
    }

    public string SourceName
    {
        get;
        set;
    }
}
1 голос
/ 12 апреля 2011

Я не мог воспроизвести это, я думаю, что это происходит до этого кода.Не могли бы вы материализовать ss перед фильтрацией, например, чтобы проверить, изолирован ли образец кода?

var itemsToFilter = ss.ToList();
string str = FilterAllSource;
            if (!string.IsNullOrEmpty(str))
            {

                itemsToFilter = itemsToFilter.Where(it => (it.SourceCode.ToUpper()
                                           .Contains(str.ToUpper())
                                     || it.SourceName.ToUpper()
                                           .Contains(str.ToUpper())));
            }

            if (top > 0)
                itemsToFilter = itemsToFilter.Take(top);

            return itemsToFilter.ToList();

Я пробовал это с linq для объектов, работало нормально:

class Program
{
    static void Main(string[] args)
    {
        var ss = new List<Dummy> { new Dummy
                     {
                         SourceCode = "m & m",
                         SourceName = "blabla"
                     }}.AsEnumerable();

        string str = "m & m";
        if (!string.IsNullOrEmpty(str))
        {
            ss = ss.Where(it => (it.SourceCode.ToUpper()
                                       .Contains(str.ToUpper())
                                 || it.SourceName.ToUpper()
                                       .Contains(str.ToUpper()))).ToArray();
        }

        var top = 2;

        if (top > 0)
            ss = ss.Take(top).ToArray();

        Console.WriteLine(ss.Count());
    }
}

public class Dummy
{
    public string SourceCode { get; set; }
    public string SourceName { get; set; }
}

Такжепопробовал с linq to sql, не тот же код, но должен вызвать ту же проблему (если была проблема):

class Program
{
    static void Main(string[] args)
    {
        string str = "&";
        using (var context = new DataClasses1DataContext())
        {
            var clients = context.Clients.Where(x => x.Code.Contains(str.ToUpper()));
            clients = clients.Take(5);
            Console.WriteLine(clients.Count());
        }          
    }
}
...