不同实体类型的 C# IQ统一定义
本文关键字:IQ 定义 实体 类型 | 更新日期: 2023-09-27 18:37:20
//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
}
如何定义产品查询变量?
谢谢!
[编辑]
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>;
}
我这样做,这是正确的方法吗?
您可以将其声明为动态类型,如果您同意将类型解析推迟到运行时。
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();