- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试用一些简洁的查询替换令人讨厌的 LINQ 2 SQL 命中以提高性能。这样做时,我必须将一堆不同的对象编织在一起,以创建保存 ASN 信息所需的所有信息所需的大对象。
我目前遇到的问题是抽象类 Orders,该类由两个单独的类 AutionOrder 和 MerchantOrder 使用鉴别器属性实现。
由于我无法使用 dapper 创建抽象类对象,因此我改用其中一个公共(public)类。但是,当它构建对象时,它在 GetSettableProps
内部失败,它找到了正确的 DeclaringType
但是 GetProperty
方法在它返回 null 时正在寻找 internal
或 EntitySet
的属性。我尝试使用 t.BaseType.GetProperty
和 p.GetAccessors().First().GetBaseDefinition().DeclaringType.GetProperty(p.Name) 来破解它。 GetSetMethod(true)
没有成功。
虚拟对象:
Order
OrderID, Name, Address, RowVersion(internal), Shipments(EntitySet),OrderDetails(EntitySet), Customer(EntityRef)
装运
ShipmentID, OrderID, TrackingNumber
订单详情
OrderDetailID, OrderID, Product, QTY, Price
客户
CustomerID, Name,
对于这个特定的 SQL 命中,我试图获取一些我需要的一对一关系映射。
SELECT o.* from Orders as o left join Customers as c on o.CustomerID = c.CustomerID where o.OrderID in (1,2,3);
这就是我用来利用 dapper 并让它发挥魔力的方法:
using (var connection = new SqlConnection(_ConnectionString))
{
connection.Open();
results = connection.Query<MerchantOrder, MerchantCustomer, MerchantOrder>(sql.ToString(),
(o, c) => { o.Customer = c; return o; },
splitOn: "CustomerID");
}
如果我将 Order 更改为公共(public)类,这个问题就会消失,但这不是预期的副作用。尝试为 RowVersion 设置 propInfo 时失败 - 将其切换为 public 而不是 internal 解决了这个问题 - 尽管不是期望的。但是当它试图为 Order 创建 Shipments 对象时失败了。同样,当 Order 是公共(public)类时,这一切都不是问题。
我还进行了单独的查询以引入多对一关系,例如 Shipments 到 Orders 和 OrderDetails 到 Orders,并将结果规范化为适当的 Order 对象。MerchantOrder 几乎是一个没有真正特殊逻辑的空类。这里的区别在于我们最终如何找到在实际 SQL 命中之前被抽象掉的 CustomerID。
另外,我使用的是截至 2011 年 12 月 20 日的最新版本的 dapper。
我真的很喜欢 dapper,但这个问题让我头晕目眩 - 所以谢谢你的帮助!
最佳答案
这是一个错误,现在已在主干中修复:
public class AbstractInheritance
{
public abstract class Order
{
internal int Internal { get; set; }
protected int Protected { get; set; }
public int Public { get; set; }
public int ProtectedVal { get { return Protected; } }
}
public class ConcreteOrder : Order
{
public int Concrete { get; set; }
}
}
// http://stackoverflow.com/q/8593871
public void TestAbstractInheritance()
{
var order = connection.Query<AbstractInheritance.ConcreteOrder>("select 1 Internal,2 Protected,3 [Public],4 Concrete").First();
order.Internal.IsEqualTo(1);
order.ProtectedVal.IsEqualTo(2);
order.Public.IsEqualTo(3);
order.Concrete.IsEqualTo(4);
}
请注意,根据设计,我们不会在基类中设置私有(private)字段或属性。这种行为可能是神奇的并且不一致。
例如:
class A { private int a {get; set;} }
class B : A { private int a {get; set;} }
class C: B {}
// What should "select 1 a" do? Set it on A? Set it on B? Set it on Both? Set it on neither?
我们选择“两者都不设置”
关于c# - 从抽象类引用继承的 EntitySet 的 dapper PropInfo Setter 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8593871/
因此,我需要获取在为其赋值时调用的 setter 的名称。像这样: var b = {}; var a = { set hey(value) { b[] = value; } } 我希望 se
我是 Android 编程的新手(~ 2 个月)有必要为几十个不同的变量设置 getter 吗? 例如—— //Yes I realise that this isn't 'dozens' publi
import Control.Lens import Control.Lens.TH data Foo = Foo { _bar, _baz :: Int } makeLenses ''
我有点困惑:我可以覆盖 setter/getter 但仍然使用 super setter/getter 吗?如果是 - 怎么办? 用例: class A { void set value(num
我有一个接收消息的应用程序。消息中存在可编辑的字段。当字段更改时,应将其保存到数据库中。不幸的是,setter 仅在 setter 的范围内更改给定字段的值。知道为什么会发生这种情况吗?这是 gett
C# 中有没有一种方法可以让 setter 从“某物”继承,这样每次为特定基类及其继承者调用 setter 时,我都可以运行一些代码? 我想做的是在我的基类上有一个名为 IsValid 的 bool
可能是一个我无法解决的非常简单的问题 - 我从 C# 开始,需要使用 getter/setter 方法向数组添加值,例如: public partial class Form1 : Form {
这两个属性实现有什么区别? public override string A { get { return "s"; } set { } } public override strin
是否可以使用 abc.abstractproperty 创建一个具体的 getter 但将 setter 抽象为每个继承类的不同。我为每个子类处理不同的 val 设置。 例如。 @abstractpr
我在某处看到类似下面的内容,想知道它是什么意思。我知道他们是getter和setter,但是想知道为什么字符串Type是这样定义的。谢谢你帮助我。 public string Type { get;
Public class Example { private int number; public Example(int number){ this.number =
假设我有这样的代码: public response MyMethod(Request req) { String id = req.getFirst().geId(); } 我已经模拟了主对
允许这样做: public int Age { get; set; } 但是应用程序是否为变量创建/分配空间?我经常这样做 private int age = 0; public int Age {
我有一个条件,我构造字符串 (finalValue) 的方式是基于我在输入中获得的非空值的数量。所以我想知道是否可以用一个不同的参数为字符串 (finalValue) 重载 setter 方法并根据我
例如,在这段代码中 var o = { set a(value) {this.b = value}, get a() {return this.b} } 是否有可能获得对 o.a 的 sett
我一直在努力了解 getter 和 setter,但没有深入了解。我读过 JavaScript Getters and Setters和 Defining Getters and Setters只是没
我想在我的类中添加一个 getter 和 setter。然而,setter 应该接收一个 querySelector,但 getter 返回一个新类型 pageSections。 我的问题是 gett
使用有什么好处: private var _someProp:String; public function set someProp(value:String):void { _somePr
当从域类调用它时,我想在我的 setter 中执行一些操作,而不是从 hibernate 中调用它时。此外,我正在使用 session 工厂,因此我无法使用 @PostLoad 来触发标志! 有人对此
人员类别: public class Person { private String firstName; private String lastName; public Pe
我是一名优秀的程序员,十分优秀!