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

时间:2012-06-14 04:24:31

标签: c# asp.net .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
    }

如何定义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>;
}

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

1 个答案:

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