C# 将Datatable函数迁移到实体框架的最佳方法

C# 将Datatable函数迁移到实体框架的最佳方法,c#,datagridview,datatables,entity-framework-5,entity-framework-6,C#,Datagridview,Datatables,Entity Framework 5,Entity Framework 6,我正在使用web Api/AngularJs/Entity Framework 6将Windows窗体应用程序迁移到web环境。该应用程序有一个报告功能,用户基本上从一组报告中选择并创建一个查询,该查询按日期、ID范围和状态过滤数据。下面显示的方法构建SELECT/WHERE语句,并将结果作为绑定到datagridview的datatable返回,因此代码非常通用和灵活。我想把这个迁移到EF,我想知道什么是最好的方法。。。 1.是否创建代表每个select语句(正文)的接口和DTO? 2.如何将

我正在使用web Api/AngularJs/Entity Framework 6将Windows窗体应用程序迁移到web环境。该应用程序有一个报告功能,用户基本上从一组报告中选择并创建一个查询,该查询按日期、ID范围和状态过滤数据。下面显示的方法构建SELECT/WHERE语句,并将结果作为绑定到datagridview的datatable返回,因此代码非常通用和灵活。我想把这个迁移到EF,我想知道什么是最好的方法。。。 1.是否创建代表每个select语句(正文)的接口和DTO? 2.如何将where子句标记为EF lambda表达式?这是最好的选择吗

我对如何以优雅和高效的方式完成这项任务持开放态度

   public DataTable GetReportData(ReportArgs rArgs)
    {
        string strSql = string.Empty;
        string whereClause = string.Format(" WHERE {0} {1}",GetDateRange(rArgs), GetIdRange(rArgs));
        string fechaI = rArgs.MatchesFechaI ? string.Format("'{0}'", rArgs.FechaI.ToShortDateString()) : "NULL";
        string fechaF = rArgs.MatchesFechaF == EnumCompararFecha.igual ? string.Format("'{0}'", rArgs.FechaF.ToShortDateString()) : "NULL";
        try
        {
            switch ((EnumReportes)rArgs.ReportNumber)
            {

                case EnumReports.GainTotal:
                    strSql = string.Format("SELECT Id,DateInitial as [Date Initial], WeightInitial as [Weight Initial], DateFinal AS [Date Final], Weightfinal as [Weight Final], Gainday as Gain FROM RepGainTotal {0} ", whereClause);
                    break;

                    ...

                    case EnumReports.GainByPeriod:
                    // In this case the Where clause is built inside of buildStringGainPeriodo(rArgs)
                    strSql = buildStringGainPeriodo(rArgs);
                    SetRepGainsPeriodo(rArgs, strSql);
                    strSql = strSql + " ORDER BY 2";
                    break;
                case EnumReports.Bulls:
                    strSql = string.Format("SELECT Id,Weight,Date1,Date2,Date3,LastGain,Total as [G. Total],round(WeightHoy,0) as [Weight Hoy]  FROM ANALISIS_CEBA {0} ", whereClause);
                    break;
                case EnumReports.SalesVsbuys:
                    strSql = string.Format("SELECT Id,Date_Sale as [Date Sale],Weight_Sale as [Weight Sale],Precio_kilo as [Precio Kilo]," +
                                           "Date_buy as [Date buy], Kilos_buy as [Weight (c)],cost_kilo as [cost Kilo], " +
                                           "GainDailyWeights as [G/day (Weights)],GainDailyGrams as [G/day (Grams)] " +
                                           " FROM SalesVsbuys {0} ", whereClause);
                    SetRepSalesVsbuys(rArgs, whereClause);
                    break;
                case EnumReports.SalesByPeriod:
                    strSql = string.Format("SELECT * FROM Sales {0} ", whereClause);
                    SetRepSales(rArgs, whereClause);
                    break;
                case EnumReports.BuysByPeriodo:
                    strSql = string.Format("SELECT * FROM buys {0} ", whereClause);
                    SetRepbuys(rArgs, whereClause);
                    break;
                case EnumReports.TasksByPeriod:
                    strSql = string.Format("SELECT Date, Task, TotalFROM RepMovimientos {0} ", whereClause);
                    SetRepMvtos(rArgs, whereClause);
                    break;
                case EnumReports.WeightsByPeriod:
                    strSql = string.Format("SELECT Date, Id, Weight FROM WeightHistory {0} order by Date,ID", whereClause);
                    SetRepPesajes(rArgs, whereClause);
                    break;
        }
    }
}       

我找到了一个解决方案:使用EF SqlQuery方法加载表示视图的DTO。因此,我仍然可以灵活地使用即席sql,然后可以使用linq、数据绑定等:

''' string strSql=string.Format(“从RepLifetimeGain中选择InitialDate等”); 字符串whereClause=WhereClauseBuilder.BuildWhereClause(rArgs)

使用(GlContext gContext=new GlContext()) { var gvida=await gContext.RepLifetimeGain.SqlQuery(string.Format(“{0}{1}”,strSql,whereClause)).ToListAsync()

。。。 }