我使用对我来说非常奇怪的功能有问题:
使用C#MVC Framework 4
我在一个我在控制器中调用的存储库类中声明了这个函数:
public IQueryable<Bus> Search(string[] states)
{
// Give all the buses that are inside the list of states that i giving you, no matter upper case or lower case
IQueryable<Bus> query = this.context.Buses;
if (states.Length > 0)
{
query = query.Where(b => states.Select(s => s.ToLower()).ToArray().Contains(b.State.ToLower()));
}
return query;
}
当我使用此功能执行操作时,我收到错误:
LINQ to Entities does not recognize the method '**System.String[] ToArray[String]**
...
...
...
但是有一个例外,如果我更改这样的代码(先使用 SqlQuery 函数):
public IQueryable<Bus> Search(string[] states)
{
// Give all the buses that are inside the list of states that i giving you, no matter upper case or lower case
IQueryable<Bus> query = this.context.Buses.SqlQuery("SELECT * FROM Buses").AsQueryable();
if (states.Length > 0)
{
query = query.Where(b => states.Select(s => s.ToLower()).ToArray().Contains(b.State.ToLower()));
}
return query;
}
当我执行相同的动作时,没有问题。有人知道为什么会这样吗?
我知道函数 SqlQuery 会返回 DbSqlQuery 对象,但之后我将该对象转换为可查询,并且由于某种原因,此对象仍允许我使用 ToArray 功能。
有没有办法在不使用 SqlQuery 功能的情况下做同样的事情?我试图导入所有这些包(包含在 DbSqlQuery 类声明中,希望声明有扩展但没有):
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
有任何帮助吗?建议?什么?
提前致谢。
度过愉快的一天:)
答案 0 :(得分:1)
SqlQuery
是IEnumerable
。执行时,数据库完成。然后,你调用.AsQueryable
(它会尝试给你一个Queryable,但如果它不能,你会给你一个看起来像IQueryable的IEnumerable)。 .ToArray发生在客户端而不是服务器端的内存中。
答案 1 :(得分:0)
我发现的解决方案很简单,我只需使用 ToArray 函数 之前的where语句:
public IQueryable<Bus> Search(string[] states)
{
// Give all the buses that are inside the list of states that i giving you, no matter upper case or lower case
IQueryable<Bus> query = this.context.Buses;
if (states.Length > 0)
{
states = states.Select(s => s.ToLower()).ToArray();
query = query.Where(b => states.Contains(b.State.ToLower()));
}
return query;
}
感谢 insta 的帮助。