0
//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>;
}

我这样做是正确的吗?

4

1 回答 1

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,您需要定义委托的类型。假设ProductInProductOut类型都有一个字符串类型属性ProductNo。然后你可以像这样写你的查询,再次使用dynamic

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(); 
于 2012-06-14T04:27:17.397 回答