C# 搜索包含&;的字符串时出错;
我使用linq查询获取包含变量字符串的对象列表:C# 搜索包含&;的字符串时出错;,c#,linq,linq-to-objects,C#,Linq,Linq To Objects,我使用linq查询获取包含变量字符串的对象列表: string str = FilterAllSource; if (!string.IsNullOrEmpty(str)) { ss = ss.Where(it => (it.SourceCode.ToUpper() .Contains(s
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)时,它抛出一个异常
在“(ResourceId eq 3)和(substringof('M')中的位置38处未终止的字符串文字。
我的猜测是&会干扰一些内部连接过程。有没有一种方法可以避免这种情况,而不必从查询字符串中删除&呢
EDIT1:ss是一个对象列表,其中SourceCode和Sourcename都是字符串
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;
}
}
类程序
{
静态void Main(字符串[]参数)
{
程序p=新程序();
List=p.GetList();
}
公共列表GetList()
{
List ss=新列表();
ss.添加(新测试(“m&mm&mm&mm&mm&mm&mm&m”、“m&mm&mm&mm&mm&mm&mm”);
string str=“m&m”;
如果(!string.IsNullOrEmpty(str))
{
ss=ss.Where(it=>(it.SourceCode.ToUpper().Contains(str.ToUpper())| | it.SourceName.ToUpper().Contains(str.ToUpper()).ToList();
}
//如果(顶部>0)
//{
//ss=ss.Take(顶部);
//}
返回ss.ToList();
}
}
公开课考试
{
公共测试(字符串源代码、字符串源名称)
{
this.SourceCode=源代码;
}
公共字符串源代码
{
得到;
设置
}
公共字符串源名称
{
得到;
设置
}
}
我无法复制它,我猜它发生在这段代码之前。你能在过滤之前具体化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 to objects试过,效果很好:
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吗?它是什么提供程序?请展示一个简短但完整的程序来演示这个问题。至少你所说的异常类型会有所帮助。我建议你找到有问题的字符串,然后编写一个简单的程序,如:
s=“有问题的文本”string f=“m&m”bool b=s.ToUpper()。Contains(f.ToUpper())
如果它显示错误,那么您已经缩小了范围。如果它没有显示错误,那么问题出在其他地方。&是XML中的转义码,您是在解析XML还是XAML?
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());
}
}
}