在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()子句中强制使用匿名类型?
类型化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