pis*_*hio 160 c# linq linq-to-entities entity-framework
在使用EntityFramework时,我A lambda expression with a statement body cannot be converted to an expression tree在尝试编译以下代码时收到错误" ":
Obj[] myArray = objects.Select(o =>
{
var someLocalVar = o.someVar;
return new Obj() {
Var1 = someLocalVar,
Var2 = o.var2 };
}).ToArray();
Run Code Online (Sandbox Code Playgroud)
我不知道错误意味着什么,最重要的是如何解决它.有帮助吗?
Tim*_*ers 102
是objectsLinq-To-SQL数据库上下文?在这种情况下,您只能在=>运算符的右侧使用简单表达式.原因是,这些表达式不会被执行,而是转换为SQL以对数据库执行.试试这个
Arr[] myArray = objects.Select(o => new Obj() {
Var1 = o.someVar,
Var2 = o.var2
}).ToArray();
Run Code Online (Sandbox Code Playgroud)
Ami*_*isi 93
您可以在lamba表达式中为IEnumerable集合使用语句体.试试这个:
Obj[] myArray = objects.AsEnumerable().Select(o =>
{
var someLocalVar = o.someVar;
return new Obj()
{
Var1 = someLocalVar,
Var2 = o.var2
};
}).ToArray();
Run Code Online (Sandbox Code Playgroud)
注意:
使用此方法时请仔细考虑,因为这样,您将在内存中获得所有查询结果,这可能会对其余代码产生不必要的副作用.
sep*_*p2k 37
这意味着你不能在lambda表达式需要转换为表达式树的地方使用带有"语句体"的lambda表达式(即使用花括号的lambda表达式)(例如使用linq2sql时的情况) .
在不了解您在做什么的情况下(Linq2Objects,Linq2Entities,Linq2Sql?),这应该可以使它工作:
Arr[] myArray = objects.AsEnumerable().Select(o => {
var someLocalVar = o.someVar;
return new Obj() {
Var1 = someLocalVar,
Var2 = o.var2
};
}).ToArray();
Run Code Online (Sandbox Code Playgroud)
LINQ to SQL 返回对象正在实现IQueryable接口。因此,对于Select方法谓词参数,您应该只提供没有主体的单个 lambda 表达式。
这是因为 LINQ for SQL 代码不在程序内部执行,而不是在 SQL 服务器或其他远程端执行。这种延迟加载执行类型是通过实现 IQueryable 实现的,其中它的期望委托被包装在像下面这样的表达式类型类中。
Expression<Func<TParam,TResult>>
Run Code Online (Sandbox Code Playgroud)
表达式树不支持带正文的 lambda 表达式,它只支持单行 lambda 表达式,如 var id = cols.Select( col => col.id );
因此,如果您尝试以下代码将不起作用。
Expression<Func<int,int>> function = x => {
return x * 2;
}
Run Code Online (Sandbox Code Playgroud)
以下将按预期工作。
Expression<Func<int,int>> function = x => x * 2;
Run Code Online (Sandbox Code Playgroud)
使用这个选择的重载:
Obj[] myArray = objects.Select(new Func<Obj,Obj>( o =>
{
var someLocalVar = o.someVar;
return new Obj()
{
Var1 = someLocalVar,
Var2 = o.var2
};
})).ToArray();
Run Code Online (Sandbox Code Playgroud)
参加聚会晚了 9 年,但对您的问题采用了不同的方法(没有人提到过?):
语句体可以正常Func<>工作,但不能与Expression<Func<>>. IQueryable.Select想要一个Expression<>,因为它们可以为实体框架翻译 -Func<>不能。
因此,您要么使用AsEnumerable并开始处理内存中的数据(不推荐,如果不是真的必要的话),要么继续使用IQueryable<>推荐的 。有一种叫法linq query可以让一些事情变得更容易:
IQueryable<Obj> result = from o in objects
let someLocalVar = o.someVar
select new Obj
{
Var1 = someLocalVar,
Var2 = o.var2
};
Run Code Online (Sandbox Code Playgroud)
withlet你可以定义一个变量并在select(or where,...) 中使用它- 你继续使用IQueryable直到你真的需要执行并获取对象。
之后你可以 Obj[] myArray = result.ToArray()
是 的Arr基本类型Obj吗?Obj 类存在吗?仅当 Arr 是 Obj 的基本类型时,您的代码才有效。你可以尝试这个:
Obj[] myArray = objects.Select(o =>
{
var someLocalVar = o.someVar;
return new Obj()
{
Var1 = someLocalVar,
Var2 = o.var2
};
}).ToArray();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
90349 次 |
| 最近记录: |