在 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。