在Select()子句中不使用匿名类型时,构建SqlExpression会引发InvalidOperationException

时间:2016-09-20 13:57:05

标签: c# servicestack ormlite-servicestack

这是我的数据库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()子句中使用匿名类型?

2 个答案:

答案 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,你可以使用你想要的任何东西。