不同实体类型的 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>;
}

我这样做,这是正确的方法吗?

不同实体类型的 C# IQ统一定义

您可以将其声明为动态类型,如果您同意将类型解析推迟到运行时。

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));

然而。。。我认为你可以通过改变你的整个方法让你的生活更轻松。 您显然是在针对 ProductInProductOut 的通用接口工作,那么为什么不明确定义呢?

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();