使用EF实体显示自定义视图

时间:2012-11-15 21:18:43

标签: c# entity-framework

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

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

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层,该列表将列表分配给DataGrid.DataSource。它有效,但似乎不正确。是否首选为嵌入在linq查询中的匿名类型创建POCO并将此逻辑移至DAL?这是用EDMX文件完成的,可以和CodeFirst POCO并行吗?

中学:如果可能的话,我很乐意做一个类似于BaseTrade / SystemATrade的多态报告,并且如果用户希望将报告视为SystemATrade而不仅仅是BaseTrade,则包含其他的继承字段。

1 个答案:

答案 0 :(得分:0)

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