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
}

もう 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));

しかし...アプローチ全体を変えることで、人生をずっと楽にすることができると思います。あなたは明らかに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 に答える