在Select()子句中不使用匿名类型时,构建SqlExpression抛出InvalidOperationExcept

本文关键字:类型 构建 InvalidOperationExcept 抛出 SqlExpression Select 子句 | 更新日期: 2023-09-27 18:07:49

这是我的数据库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在系统中失败。InvalidOperationException:

"变量'c'的类型'MyPoco1'从作用域引用",但它是没有定义"。

q2可以工作,但是是否有一种方法可以使用强类型(检查正确的属性名称/类型)来做到这一点,或者在.Select()子句中强制使用匿名类型?

在Select()子句中不使用匿名类型时,构建SqlExpression抛出InvalidOperationExcept

类型化OrmLite sqlexexpression中.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。

你的代码

var q1 = Db.From().Select(c => new MyPocoAlias1 {OtherName = c. name})

这就是我们使用匿名类型的方式。删除你的类MyPocoAlias1,因为它不需要。您使用了匿名类型,但您已为其命名。将其改为

var q1 = Db.From<MyPoco1>()
    .Select(c => new { OtherName = c.Name })

你可以用任何你想用的来代替OtherName