3

ジェネリックを使用して1つのメソッドに圧縮できる次の2つのメソッドがあります。私が試したことはコンパイルできません。誰かがこれを行う方法を教えてもらえますか? テーブル AgeLengths の 2 つの differents フィールドに少なくとも 1 つの値があることを確認する必要があります。Str_table は、AgeLengths と 1 対多の関係にあります。

public static bool HasMeanWeight(int id)
{
    MyDataContext dc = new MyDataContext ();
    return  (from s in dc.Str_table 
             where s.SId == id 
             select s.AgeLengths
             .Where(a => a.MeanWeight != null ).Any() == true
            ).FirstOrDefault();
}

public static bool HasNumbersData(int id)
{
    MyDataContext dc = new MyDataContext ();
    return (from s in dc.Str_table 
            where s.sId == id 
            select s.AgeLengths
            .Where(a => a.Numbers  != null).Any() == true
           ).FirstOrDefault();
}

よろしくお願いします B

4

2 に答える 2

5

更新:申し訳ありませんが、これが linq to sql であることに気付きませんでした。デニスの答えは的を射ているようです。

Func<T, TResult>aを挿入して、異なるコードを挿入してみてください。

public static bool HasData(int id, Func<AgeLength, object> selector)
{
    MyDataContext dc = new MyDataContext ();
    return (from s in dc.Str_table 
            where s.sId == id 
            select s.AgeLengths
                .Where(a => selector(a) != null)
                .Any())
           .FirstOrDefault();
}

そして、次のように呼び出します。

HasData(1, a => a.Numbers);
HasData(1, a => a.MeanWeight);

NumbersMeanWeightプロパティが同じ継承階層にある場合は、より便利なものに置き換えることができますがobject、この場合objectは null をテストしているだけなので問題ありません。

于 2012-09-25T08:56:02.403 に答える
3

一部DataContextの を使用している場合は、 を使用してIQueryable<T>おり、式に記述できるものは非常に限られています。したがって、述語自体ではなく、をメソッドに渡す必要があります。

static bool HasData(int id, Expression<Func<AgeLength, bool>> predicate)
{
    using (MyDataContext dc = new MyDataContext())
    {
        return (from s in dc.Str_table
                where s.sId == id
                select s.AgeLengths
                .Any(predicate)
               ).FirstOrDefault();
    }
}

その上:

  • Any述語式を受け入れるオーバーロードがあります。
  • コンテキストを破棄する必要があります (を参照using)。
  • 書く必要はありませんsomeBoolExpression == true。ただ書いてsomeBoolExpressionください。

このメソッドを次のように呼び出すことができます。

HasData(1, a => a.MeanWeight != null);
HasData(1, a => a => a.Numbers  != null);

2 番目の引数はラムダ式であり、メソッドではないことに注意してください。
これは、クエリの怠惰な性質によるものです。式のセットを提供すると、対応するプロバイダーがそれらを適切な SQL に変換します。

于 2012-09-25T09:10:43.850 に答える