C# 无法使用Select(x=>Func(x))转换为SQL

C# 无法使用Select(x=>Func(x))转换为SQL,c#,asp.net,linq,linq-to-sql,C#,Asp.net,Linq,Linq To Sql,我正在慢慢学习LINQtoSQL的细节,但这让我感到困惑 以下是我的声明: IQueryable<IEvent> events = (from e in db.getEvents() select e).Select(x => SelectEvent(x, null)); 我的问题是关于选择方法。我收到无法转换为SQL错误,错误消息中列出了Select 在这一点上,我一无所知:-/.Linq to SQL不能将这样的任意

我正在慢慢学习LINQtoSQL的细节,但这让我感到困惑

以下是我的声明:

IQueryable<IEvent> events = (from e in db.getEvents()
                            select e).Select(x => SelectEvent(x, null));
我的问题是关于选择方法。我收到无法转换为SQL错误,错误消息中列出了Select


在这一点上,我一无所知:-/.

Linq to SQL不能将这样的任意函数调用转换为SQL。它不知道该函数的作用。您必须使用表达式构造SelectEvent所做的任何事情


或者,如果您只想在查询遍历数据库后将对象映射到其他对象,只需在循环遍历结果时执行即可,或者为您创建一个包装生成器。

这里的问题是,在LinqToSQL中,您的查询首先转换为表达式树,然后转换为实际运行的SQL代码。表达式树形式的C代码只有一小部分可以转换为SQL

在这种情况下,表达式树包含对驻留在当前程序集SelectEvent中的方法的调用。转换程序无法将此方法转换为可在SQL server中运行的代码,因此会抛出错误


要解决此问题,请尝试将SelectEvent的代码内联到查询表达式中

它合理地抱怨它无法将SelectEvent调用转换为SQL

如果将.AsEnumerable置于.Select C之前,将使用IEnumerable Select而不是IQueryable Select:

interface IEnumerable<T> {
    ...
    // Actually, these are extension methods in Enumerable and Queryable.
    IEnumerable<T> Select<TResult>(Func<T, TResult> selector);
    ...
}

interface IQueryable<T> : IEnumerable<T> {
    ...
    IQueryable<T> Select<TResult>(Expression<Func<T, TResult>> selector);
    ...
    IEnumerable<T> AsEnumerable();
}

IEnumerable<IEvent> events = db.getEvents().AsEnumerable().Select(x => SelectEvent(x, null));

IEnumerable Select对从源IEnumerable返回的每个项执行一次Func选择器,IQueryable Select将表达式选择器传递给LINQ提供程序—在LINQ2SQL的情况下,该提供程序尝试生成等效的SQL。

这是lambdas作为委托和lambdas作为表达式树之间的区别。简而言之,你不能那样做。你能告诉我SelectEvent想做什么吗?所有的答案都很好——把你的答案标记为你是第一个:P。这很有意义。SelectEvent方法的主要原因是它有一个switch语句——我创建了一个IEvent类型的特定事件。我不知道如何只用一个linq2sql表达式就可以做到这一点。这将如何与分页一起工作?我担心的是,如果我将所有事件都存储到内存中,这不是比从SQL server获取一页数据更糟糕吗?感谢您的回答+1在本地运行它只是指SelectEvent的执行,数据仍然以相同的方式检索。已编辑。@SimonBuchan我遇到了类似的问题,我正在寻找解决办法。你能详细介绍一下IEEventSelectEventSqlServer.Event吗?我在谷歌上搜索了一下,但我不确定我是否理解这一点。我会接受一个事件,然后……我会对那个事件应用一个参数,然后返回什么?此外,这不会转换为表达式树,而是在本地运行,对吗?那么,LINQ到SQL表达式方法能否成功实现这一点,比如.Take和.Where?还是会在记忆中吐出一个IEnumerable?很抱歉问了这么多问题,我不懂,但我想理解!似乎LINQtoSQL表达式中的函数通常不是一个好主意。有道理,但我希望不是这样:P.谢谢+1.
interface IEnumerable<T> {
    ...
    // Actually, these are extension methods in Enumerable and Queryable.
    IEnumerable<T> Select<TResult>(Func<T, TResult> selector);
    ...
}

interface IQueryable<T> : IEnumerable<T> {
    ...
    IQueryable<T> Select<TResult>(Expression<Func<T, TResult>> selector);
    ...
    IEnumerable<T> AsEnumerable();
}

IEnumerable<IEvent> events = db.getEvents().AsEnumerable().Select(x => SelectEvent(x, null));
IEnumerable<IEvent> events = db.getEvents().Select(SelectEvent);