Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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# ToString()&;Contains()不支持到SQL的转换_C#_Asp.net Mvc_Asp.net Mvc 3_Datatables_Jquery Datatables - Fatal编程技术网

C# ToString()&;Contains()不支持到SQL的转换

C# ToString()&;Contains()不支持到SQL的转换,c#,asp.net-mvc,asp.net-mvc-3,datatables,jquery-datatables,C#,Asp.net Mvc,Asp.net Mvc 3,Datatables,Jquery Datatables,我有一个将JSON返回到jQuery的操作。返回的数据可以根据传递给它的参数进行过滤。代码如下: public ActionResult IndexAjaxHandler(jQueryDataTableParamModel parameters) { var data = _mailingListRep.GetAllWithinAccount(); IEnumerable<MailingList> filtered; // Filtering - THIS

我有一个将JSON返回到jQuery的操作。返回的数据可以根据传递给它的参数进行过滤。代码如下:

public ActionResult IndexAjaxHandler(jQueryDataTableParamModel parameters) {
    var data = _mailingListRep.GetAllWithinAccount();
    IEnumerable<MailingList> filtered;

    // Filtering - THIS DOES NOT WORK!
    if (!string.IsNullOrEmpty(parameters.sSearch)) {
        filtered = data.Where(c => 
            c.MailingListName.Contains(parameters.sSearch) ||
            ((c.IsDoubleOptIn) ? "Yes" : "No").Contains(parameters.sSearch, StringComparison.OrdinalIgnoreCase) ||
            c.Created.ToString("dd MMM yyyy").Contains(parameters.sSearch) ||
            c.ActiveMembers.Count().ToString().Contains(parameters.sSearch) ||
        c.AvailableSegments.Count().ToString().Contains(parameters.sSearch)
        );
    }
    else {
        filtered = data;
    }

    // create json object
    // return;
}
我理解这个错误的意思,这是因为代码在一个动作中工作,而不是另一个动作让我完全困惑


感谢您提前提供的帮助。

一种方法是,如果在这两种情况下,运行时数据引用的类型不同

例如,如果它们都具有编译时类型
IEnumerable
,但其中一个具有使LINQ成为LINQ2SQL的运行时类型,而另一个使其成为LINQ2SQL对象。包含后者的作品,但不包含前者

IEnumerable<Entity> data = db.GetMyLazilyEvaluatedListOfEntities();
//this will fail
data.Where(e => e.Foo.Contains("bar"));
data = new List<Entity>();
//this will work
data.Where(e => e.Foo.Contains("bar"));
IEnumerable data=db.GetMyLazilyEvaluatedListOfEntities();
//这将失败
其中(e=>e.Foo.Contains(“bar”);
数据=新列表();
//这会奏效的
其中(e=>e.Foo.Contains(“bar”);
其中
db.GetMyLazilyEvaluatedListOfEntities
返回一个对象,该对象实现了
IQueryable
,在计算时将转换为SQL


如果在where之前调用
data.ToList()
,可以避免运行时异常。但是,这将从数据库中获取整个表,并在内存中进行筛选。如果表中有fewish行,这应该是一个非常令人担忧的问题,但是如果您希望数据库表中有大量记录作为数据的支持,那么您应该将其重写为可以转换为SQL的内容,您的第一个不起作用的过滤器将应用于
IQueryable
,而第二个起作用的过滤器将应用于
IEnumerable
。 当应用于
IQueryable
时,筛选器必须可翻译为SQL,而当它用于
IEnumerable
时,筛选器将在内存中计算


要使第一个有效,您需要在应用过滤器之前调用
ToList()
将结果强制存储到内存中,或者使用类中可用的帮助器方法。

这两种情况下的数据运行时类型是什么?在第二个示例中是
data
还是
IEnumerable
?在这两种情况下,它们都是
IEnumerable
,第一种是
IEnumerable
,第二个
IEnumerable
我已经更新了第二个示例的代码,以使差异更加清晰编译时类型无关紧要,重要的是运行时类型(运行时类型始终是一个具体类型,而不是一个接口)我相信你想说的是正确的,但是第一个必须是
IQueryable
这是错误的,重要的不是编译时类型,而是运行时类型。它们可能都具有编译时类型
IEnumerable
,其中一个可能仍然使用linq2sql,另一个可能仍然使用linq2sqllinq2object@RuneFS我不是说编译时类型必须是
IQueryable
,我只是说运行时类型必须是
IQueryable
,代码才能执行该行为。所以我不确定我是否理解你的意思。你的答案是正确的,添加了
data.ToList()
修复了这个问题。我不知道Linq在运行时使用了不同的数据类型。因为运行时类型不能是
IQueryable
“我只是说运行时类型必须是
IQueryable
”没有什么意义。运行时类型始终是一个具体的类,而不是一个接口。你会怎么做呢?
new IQueryable()
,因为除非你能做到这一点,否则你就不会有运行时类型的
IQueryable()
@RuneFS,我的意思是必须是,就像“湖水结冰了,温度必须是0或更低”。当提到运行时类型
IQueryable
时,我显然是指实现
IQueryable
的某种类型,而不仅仅是实现
IEnumerable
。但如果你觉得我可以更简洁,你可以自由编辑我的答案。
public static bool Contains(this string source, string toCheck, StringComparison comp) {
    return source.IndexOf(toCheck, comp) >= 0;
}
IEnumerable<Entity> data = db.GetMyLazilyEvaluatedListOfEntities();
//this will fail
data.Where(e => e.Foo.Contains("bar"));
data = new List<Entity>();
//this will work
data.Where(e => e.Foo.Contains("bar"));