//I need to deifne productQuery here
if (test == true)
{
var productQuery = ordersRepository.ProductIn; //it returns IQueryable<ProductIn> type
}
else
{
var productQuery = ordersRepository.ProductOut; //it returns IQueryable<ProductOut> type
}
如何定义productQuery变量?
谢谢!
[编辑]
dynamic productType;
if (test == true)
{
productType = ordersRepository.ProductIn; //it returns IQueryable<ProductIn> type
}
else
{
productType = ordersRepository.ProductOut; //it returns IQueryable<ProductOut> type
}
var productQuery = productType as IQueryable<ProductIn>;
if (productQuery == null)
{
productQuery = productType as IQueryable<ProductIn>;
}
我这样做,是不是正确的方式?
答案 0 :(得分:5)
如果您可以将类型解析延迟到运行时,则可以将其声明为动态类型。
dynamic productQuery;
if (test == true)
{
productQuery = ordersRepository.ProductIn; //it returns IQueryable<ProductIn> type
}
else
{
productQuery = ordersRepository.ProductOut; //it returns IQueryable<ProductOut> type
}
您的另一种选择是将其声明为对象类型,然后根据需要将其强制转换为其他类型。
object productQuery;
if (test == true)
{
productQuery = ordersRepository.ProductIn; //it returns IQueryable<ProductIn> type
}
else
{
productQuery = ordersRepository.ProductOut; //it returns IQueryable<ProductOut> type
}
// ... more logic ...
var unboxed = productQuery as IQueryable<ProductIn>;
if (unboxed != null) {
unboxed.Where( ... and away you go with Linq ...);
}
操作后更新
假设您有一个动态类型 productQuery 。要在其上使用Linq,您需要定义委托的类型。假设类型 ProductIn 和 ProductOut 都有一个字符串类型属性 ProductNo 。然后你可以像这样编写你的查询,再次使用动态。
productQuery.Where(new Func<dynamic,bool>(item => item.productNo));
然而...... 我认为通过改变整个方法,你可以让生活变得更轻松。您显然正在使用 ProductIn 和 ProductOut 的公共接口,那么为什么不明确定义呢?
public interface IProduct
{
public string ProductNo { get; set; }
}
public class ProductIn : IProduct { ... }
public class ProductOut : IProduct { ... }
现在您的代码变得更加简单了。写得像这样:
IQueryable<IProduct> productQuery;
if (test == true)
{
productQuery = ordersRepository.ProductIn; //it returns IQueryable<ProductIn> type
}
else
{
productQuery = ordersRepository.ProductOut; //it returns IQueryable<ProductOut> type
}
string myResult = productQuery.Where(item => item.productNo == productNo).FirstOrDefault();