这是我的数据库POCO:
public class MyPoco1
{
public int Id { get; set; }
public string Name { get; set; }
}
我想选择并将结果映射到具有不同属性名称的自定义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而失败:
&#34;变量&#39; c&#39;类型&#39; MyPoco1&#39;从范围&#39;&#39;引用,但它是 未定义&#34;。
q2有效,但有没有办法用强类型(检查正确的属性名称/类型)来执行此操作,还是必须在.Select()子句中使用匿名类型?
答案 0 :(得分:3)
Typed OrmLite SqlExpression中.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。
答案 1 :(得分:1)
代码
var q1 = Db.From() 。选择(c =&gt; new MyPocoAlias1 {OtherName = c.Name})
这是我们使用匿名类型的方式。删除您的班级MyPocoAlias1
,因为不需要它。您使用过匿名类型但已命名。将其更改为
var q1 = Db.From<MyPoco1>()
.Select(c => new { OtherName = c.Name })
而不是OtherName,你可以使用你想要的任何东西。