Вы можете объявить его как динамический тип, если вы не против отложить разрешение типа до времени выполнения.
dynamic productQuery;
if (test == true)
{
productQuery = ordersRepository.ProductIn; //it returns IQueryable<ProductIn> type
}
else
{
productQuery = ordersRepository.ProductOut; //it returns IQueryable<ProductOut> type
}
Другой вариант — объявить его как тип object, а затем при необходимости привести его обратно к другому типу.
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. Затем вы можете написать свой запрос следующим образом, снова используя dynamic.
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();
14.06.2012