C# C Linq条件转换对象到EF表类型

C# C Linq条件转换对象到EF表类型,c#,entity-framework,linq,C#,Entity Framework,Linq,目前有 var orders = (from x in _contextComet.vwOrderSummary) if (StartDate != null) { orders = orders.Where(x => x.DateCreated >= StartDate); } 现在我需要将其更改为以下内容,然后使用queryable对象在同一函数中进行进一步筛选 if (inTestMode) { var orders = (from x in _contex

目前有

var orders = (from x in _contextComet.vwOrderSummary)
if (StartDate != null) 
{
    orders = orders.Where(x => x.DateCreated >= StartDate);
}
现在我需要将其更改为以下内容,然后使用queryable对象在同一函数中进行进一步筛选

if (inTestMode)
{
    var orders = (from x in _contextComet.vwOrderSummaryTest)
}
else
{
    var orders = (from x in _contextComet.vwOrderSummary)
}
if (StartDate != null) 
{
    orders = orders.Where(x => x.DateCreated >= StartDate);
}
更好的方法:
根据您的表vwOrderSummary、vwOrderSummaryTest的名称,我认为您是在混合开发环境和产品环境。不要检查调试模式与prod模式,并从不同的表中选择,但有2个独立的数据库,并根据模式插入不同的连接字符串。这可以用MSBuild很好地完成。

多亏了Gilad添加的.ProjectTo

IQueryable<OrderSummary> orders = inTestMode ?
_contextComet.vwOrderSummaryAlls.Select(item => new OrderSummary { ID = item.ID }) :
_contextComet.vwOrderSummaries.ProjectTo<OrderSummary>();

你的问题是什么?var在编译时推断类型。它不是动态类型。如果您的第二个代码段试图在两个不同的位置声明同一引用作为两个备用类型,然后在任何一个声明的范围之外使用它,那么这是行不通的。您可能可以使用单个非通用IQueryable命令执行某些操作;,但这取决于您对结果所做的操作。var orders=from x in_contextComet.vwordersummmary if StartDate!=null{orders=orders.Wherex=>x.DateCreated>=StartDate;}这不会编译,我会完全避免这种代码。不要将测试模式烘焙到生产代码中,而是在EF中使用不同的连接字符串连接到测试数据库,或者使用模拟。除了在生产软件中创建测试模式之外,还可以找到其他方法来实现这一点。因此,您有3件事叫做订单,我相信这是您问题的根源!!少考虑一下,您没有显示足够的代码。我在SQL Server中有两个视图,现在需要根据INTESMODE布尔值更改视图。两个视图完全相同,但其中一个过滤日期范围,而另一个不过滤。类OrderSummary存在于项目中,可以用于两个视图,因为它们具有相同的字段。我厌倦了Gilad Green方法并获取无法确定条件表达式的错误类型,因为“System.Linq.IQueryable”和“System.Data.Entity.DbSet”之间没有隐式转换_contextComet.vwOrderSummaryAlls.Selectitem=>new OrderSummary{ID=item.ID}:_contextComet.vwOrderSummaries;如果开始日期!=空订单=订单。其中x=>x.DateCreated>=StartDate;很高兴它帮你找到了解决办法。请记住,混合测试和产品环境不是一个好的做法
IQueryable<OrderSummary> orders = inTestMode ?
_contextComet.vwOrderSummaryAlls.Select(item => new OrderSummary { ID = item.ID }) :
_contextComet.vwOrderSummaries.ProjectTo<OrderSummary>();