在 Select() 子句中不使用匿名类型时构建 SqlExpression 会抛出 InvalidOperationException
Building SqlExpression throws InvalidOperationException when not using anonymous type in Select() clause
这是我的数据库 POCO :
public class MyPoco1
{
public int Id { get; set; }
public string Name { get; set; }
}
我想 select 并将结果映射到具有不同 属性 名称的自定义 POCO 中:
public class MyPocoAlias1
{
public string OtherName { get; set; }
}
public class MyService : ServiceStack.Service
{
public List<MyPocoAlias1> Any(MyRequest request)
{
// throws InvalidOperationException
var q1 = Db.From<MyPoco1>().Select(c => new MyPocoAlias1 { OtherName = c.Name });
// this works
var q2 = Db.From<MyPoco1>().Select(c => new { OtherName = c.Name });
var items = Db.Select<MyPocoAlias1>(q2);
return items;
}
}
q1 失败 System.InvalidOperationException :
"variable 'c' of type 'MyPoco1' referenced from scope '', but it is
not defined".
q2 有效,但是有没有办法使用强类型(检查正确 属性 names/types)或者在 .[=25 中使用匿名类型是强制性的=]() 子句 ?
在您的代码中
var q1 = Db.From()
.Select(c => new MyPocoAlias1 { OtherName = c.Name })
这就是我们使用匿名类型的方式。删除你的 class MyPocoAlias1
因为它不需要。您使用了匿名类型,但您已经命名了它。将其更改为
var q1 = Db.From<MyPoco1>()
.Select(c => new { OtherName = c.Name })
您可以使用任何您想要的名称来代替 OtherName。
Typed OrmLite SqlExpression 中 .Select()
的目的是指定应在 SELECT 表达式中指定哪些字段。您可以将其用于 select 单个字段,例如:
var q = db.From<Table>().Select(x => x.Name);
多个字段:
var q = db.From<Table>().Select(x => new { x.Id, x.Name });
或别名字段:
var q = db.From<Table>().Select(x => new { x.Id, OtherName = x.Name });
它不是用于指定它应该投影到哪个模型,而是在您执行查询时发生的,例如:
var results = db.Select<MyPocoAlias1>(q);
它将返回的结果集(例如SELECT Id,Name AS "OtherName")映射到MyPocoAlias1
POCO。
这是我的数据库 POCO :
public class MyPoco1
{
public int Id { get; set; }
public string Name { get; set; }
}
我想 select 并将结果映射到具有不同 属性 名称的自定义 POCO 中:
public class MyPocoAlias1
{
public string OtherName { get; set; }
}
public class MyService : ServiceStack.Service
{
public List<MyPocoAlias1> Any(MyRequest request)
{
// throws InvalidOperationException
var q1 = Db.From<MyPoco1>().Select(c => new MyPocoAlias1 { OtherName = c.Name });
// this works
var q2 = Db.From<MyPoco1>().Select(c => new { OtherName = c.Name });
var items = Db.Select<MyPocoAlias1>(q2);
return items;
}
}
q1 失败 System.InvalidOperationException :
"variable 'c' of type 'MyPoco1' referenced from scope '', but it is not defined".
q2 有效,但是有没有办法使用强类型(检查正确 属性 names/types)或者在 .[=25 中使用匿名类型是强制性的=]() 子句 ?
在您的代码中
var q1 = Db.From() .Select(c => new MyPocoAlias1 { OtherName = c.Name })
这就是我们使用匿名类型的方式。删除你的 class MyPocoAlias1
因为它不需要。您使用了匿名类型,但您已经命名了它。将其更改为
var q1 = Db.From<MyPoco1>()
.Select(c => new { OtherName = c.Name })
您可以使用任何您想要的名称来代替 OtherName。
Typed OrmLite SqlExpression 中 .Select()
的目的是指定应在 SELECT 表达式中指定哪些字段。您可以将其用于 select 单个字段,例如:
var q = db.From<Table>().Select(x => x.Name);
多个字段:
var q = db.From<Table>().Select(x => new { x.Id, x.Name });
或别名字段:
var q = db.From<Table>().Select(x => new { x.Id, OtherName = x.Name });
它不是用于指定它应该投影到哪个模型,而是在您执行查询时发生的,例如:
var results = db.Select<MyPocoAlias1>(q);
它将返回的结果集(例如SELECT Id,Name AS "OtherName")映射到MyPocoAlias1
POCO。