LINQ to Entities无法识别方法'System.String [] ToArray [String],除非使用SqlQuery方法

时间:2014-09-02 21:31:41

标签: c# asp.net-mvc-4 linq-to-entities

我使用对我来说非常奇怪的功能有问题:

使用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;

有任何帮助吗?建议?什么?

提前致谢。

度过愉快的一天:)

2 个答案:

答案 0 :(得分:1)

SqlQueryIEnumerable。执行时,数据库完成。然后,你调用.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 的帮助。