4

我正在尝试构建一个相当简单的 winform 应用程序来从几个不同的系统加载类似的数据,然后在不同的视图/报告中显示数据。我第一次使用实体框架,我不确定这些“报告”视图如何适合 ORM 框架。

该模型非常基础,一个名为Trade的基本抽象类被实现为具有系统特定数据的几个具体类。我明白这一点,如果用户想要查看其他字段(感谢这个 SO question),我可以在显示为基类或具体实现(例如 SystemATrade )的数据网格中显示所有交易。

public abstract class BaseTrade
{
    [Key, Column(Order=0)]
    public string SourceSystem { get; set; }
    [Key, Column(Order = 1)]
    public string TradeID {get; set;}

    public DateTime TradeDate { get; set; }
    public string Buy_Sell { get; set; }
    public decimal Quantity { get; set; }
    public decimal Price { get; set; }
}

public partial class SystemATrade : Trade
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
}

public partial class SystemBTrade : Trade
{
    public string Field3 { get; set; }
    public string Field4 { get; set; }
}

public class TradeComplianceContext : DbContext
{
    public DbSet<BaseTrade> Trades { get; set; }

    public TradeComplianceContext() { }

}

现在我想添加一些自定义视图,例如在 TradeDate 和 Quantity 上的自加入交易,以显示与此类似的相关交易:

_context = new TradeComplianceContext();
var query = from t1 in _context.Trades
    join t2 in _context.Trades on
    new
    {
        Quantity = t1.Quantity,
        TradeDate = t1.TradeDate
    } equals
    new
    {
        Quantity = t2.Quantity,
        TradeDate = t2.TradeDate
    }
    where
    t1.Buy_Sell.Equals("P") && t2.Buy_Sell.Equals("S")
    select new
    {
        t1.SourceSystem,
        t1.TradeDate,
        t1.Quantity,
        t1.TradeID,
        t1.Price,
        t1.TraderID,
        t1.TraderName,
        T2_TradeID = t2.TradeID,
        T2_Price = t2.Price,
        T2_TraderID = t2.TraderID,
        T2_TraderName = t2.TraderName
    };

return query.ToList();

该代码当前存在于我的业务逻辑层中,并向 UI 层返回一个列表,该 UI 层将该列表分配给 DataGrid.DataSource。它有效,但似乎不正确。是否首选为嵌入在 linq 查询中的匿名类型创建 POCO 并将此逻辑移至 DAL?这是否可以通过 EDMX 文件完成,并且可以与 CodeFirst POCO 并行吗?

次要:如果可能的话,如果用户希望将报告视为 SystemATrade 而不仅仅是 BaseTrade,我愿意做一个类似于 BaseTrade/SystemATrade 的多态报告,并包含额外的继承字段。

4

1 回答 1

0

你能解释一下为什么查询返回的数据不正确吗?这将有助于指出问题。是的,您可以创建一个 POCO 以使其更易于维护,但如果查询中存在缺陷,创建 POCO 并不能修复它。

于 2012-11-18T19:20:24.850 回答