C#不同实体类型的IQueryable定义

Exp*_* be 0 .net c# asp.net generics iqueryable

//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
    }
Run Code Online (Sandbox Code Playgroud)

如何定义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>;
}
Run Code Online (Sandbox Code Playgroud)

我这样做,是不是正确的方式?

McG*_*gle 5

您可以将其声明为动态类型,如果您可以将类型解析延迟到运行时.

dynamic productQuery;
if (test == true)
{
    productQuery = ordersRepository.ProductIn; //it returns IQueryable<ProductIn> type
}
else
{
    productQuery = ordersRepository.ProductOut; //it returns IQueryable<ProductOut> type
}
Run Code Online (Sandbox Code Playgroud)

您的另一种选择是将其声明为对象类型,然后根据需要将其强制转换为其他类型.

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 ...);
}
Run Code Online (Sandbox Code Playgroud)

操作编辑后更新

假设您有一个动态类型的productQuery.要在其上使用Linq,您需要定义委托的类型.假设ProductInProductOut类型都具有字符串类型属性ProductNo.然后你可以像这样编写你的查询,再次使用动态.

productQuery.Where(new Func<dynamic,bool>(item => item.productNo));
Run Code Online (Sandbox Code Playgroud)

但是......我认为通过改变整个方法,你可以让你的生活变得更轻松.您显然正在使用ProductInProductOut的通用接口,那么为什么不明确定义呢?

public interface IProduct
{
    public string ProductNo { get; set; }
}

public class ProductIn : IProduct { ... }
public class ProductOut : IProduct { ... }
Run Code Online (Sandbox Code Playgroud)

现在你的代码变得更简单了.写这样:

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(); 
Run Code Online (Sandbox Code Playgroud)