Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 搜索包含&;的字符串时出错;_C#_Linq_Linq To Objects - Fatal编程技术网

C# 搜索包含&;的字符串时出错;

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

我使用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)时,它抛出一个异常

在“(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());
        }          
    }
}