RohitVaidya Ответов: 1

Проблема обработки одинарная кавычка в содержит функцию преобразования языка LINQ в C#


Привет, я столкнулся с проблемой при поиске записи с помощью LINQ. Проблема заключается в том, что когда строка поиска содержит одинарную кавычку, например //*[local-name()='ClaimInfo'], то я получаю 0 результат для него даже после того, как у меня есть запись в таблице с тем же значением. Пример блока кода приведен ниже

var expression = "//*[local-name()='ClaimInfo']"

var vList= (from vocab in db.Vocabularies
           where vocab.Expression.ToUpper().Contains(expression.ToUpper())
           select vocab).ToList();


Что я уже пробовал:

Я попробовал заменить функцию, как показано в приведенном ниже коде, но никакого результата для меня не было. :-(

var vList= (from vocab in db.Vocabularies
  where vocab.Expression.Replace("'","''").ToUpper().Contains(expression.Replace("'", "''").ToUpper())
        select vocab).ToList();


Я уже пробовал заменить("'", @"/'") и заменить("'", "") тоже, но безуспешно.

Alek Massey

Вероятно, подозреваемые, что ' - это не единственная цитата в вашей БД или - это не тире в вашей БД.

Отладьте свое приложение и посмотрите, как выглядит vList с более широким выражением "contains".
Что-то вроде,

var expression = "ClaimInfo"var vList= (from vocab in db.Vocabularies           where vocab.Expression.ToUpper().Contains(expression.ToUpper())           select vocab).ToList();


Сравните этот результат с использованием следующего:
var expression = "'ClaimInfo'"

и
var expression = "local-name"

RohitVaidya

Спасибо Алеку за комментарий. "- это только одинарная цитата, и то же самое верно и в отношении - а также. Перед публикацией вопроса я также отладил и попробовал другое решение, как я уже упоминал в этом посте

1 Ответов

Рейтинг:
1

Vincent Maverick Durano

Одинарные кавычки должны работать с .Contains() метод расширения, если только текст не содержит двойных кавычек.

Я только что проверил это на примере:

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
					
public class Program
{
	public static void Main()
	{
		string expression = "//*[local-name()='ClaimInfo']";
		
		List<string> listExp = new List<string>();
        listExp.Add("a");
		listExp.Add("b");
		listExp.Add("c''");
		listExp.Add("//*[local-name()='ClaimInfo']");
		
		var result = listExp.Where(o => o.Contains(expression));
		
		if(result.Any())
			Console.WriteLine(result.First()); //prints //*[local-name()='ClaimInfo']
	}
}


Вам необходимо проверить фактическое значение vocab.Expression что вы сравниваете с вашим expression значение, которое вы передали в свой метод Contains.


RohitVaidya

Привет, Винсент, спасибо за помощь. Он работает в случае предоставленного Вами образца, так как это простой список, а не данные, поступающие из объекта базы данных.
Я проверил vocab.Expression со значением выражения, которое я передаю, оба они похожи.
В программировании SQL server для символа ' нам нужно использовать escape-последовательность в предложении where, но в случае оператора c# linq с сущностью db это создает проблему.