実行時まで型解決を延期しても問題ない場合は、動的型として宣言できます。
dynamic productQuery;
if (test == true)
{
productQuery = ordersRepository.ProductIn; //it returns IQueryable<ProductIn> type
}
else
{
productQuery = ordersRepository.ProductOut; //it returns IQueryable<ProductOut> type
}
もう 1 つの選択肢は、それをオブジェクト型として宣言し、必要に応じて他の型にキャストすることです。
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 ...);
}
opの編集後に更新
動的タイプの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();