0

リストを作成しているlinqクエリがあります。whereの場合にのみ2番目の句を使用したいaffiliationID != 0。任意のヒント?

var associations = (from a in ftjent.Associations
                    join ap in ftjent.AssociationProducts on a.AssociationID equals ap.AssociationID
                    where ap.Product.Name == productName
                    where a.AffiliationID == affiliationID
                    select new
                        {
                            a.Acronym,
                            a.AssociationID,
                            a.Name
                         }
                     ).Distinct().OrderBy(assoc => assoc.Acronym);
4

4 に答える 4

3

0と比較affiliationIdします。値がない場合は、whereが常に評価されtrue、2番目の比較は行われません。

var associations = (from a in ftjent.Associations
                join ap in ftjent.AssociationProducts on a.AssociationID equals ap.AssociationID
                where ap.Product.Name == productName
                where (affiliationId == 0) ||  a.AffiliationID == affiliationID
                select new
                    {
                        a.Acronym,
                        a.AssociationID,
                        a.Name
                     }
                 ).Distinct().OrderBy(assoc => assoc.Acronym);
于 2012-08-24T18:31:44.833 に答える
0
var associations = (from a in ftjent.Associations
                join ap in ftjent.AssociationProducts on a.AssociationID equals ap.AssociationID
                where ap.Product.Name == productName
                && (a.AffiliationID == affiliationID
                   || affiliationID == null || affiliationID == 0)
                select new
                    {
                        a.Acronym,
                        a.AssociationID,
                        a.Name
                     }
                 ).Distinct().OrderBy(assoc => assoc.Acronym);

基本的に、条件の下で条件を追加しようとするのではなく、これらのタイプの問題(一般的ですが、私を信じています)の通常の解決策は、条件の負の値を「または」として指定し、クエリに代替を与えることです。ここでは、レコードのaffiliationIDが基準に一致する必要があるか、基準値が意味を持たないため、すべてのレコードに対して完全な条件が真になります。

于 2012-08-24T18:31:48.183 に答える
0

別のオプションも:

var associations = (from a in ftjent.Associations
                join ap in ftjent.AssociationProducts on a.AssociationID equals   ap.AssociationID
                where ap.Product.Name == productName               
                select new
                    {
                        a.Acronym,
                        a.AssociationID,
                        a.Name,
                        a.AffiliationID //add AffilationID into the unknown type

                     }
                 ).Distinct().OrderBy(assoc => assoc.Acronym);

if(affilationID != 0)
     associations = associations.Where(a=>a.AffiliationID == affiliationID);

これは最短のコードではありませんが、フローを明確に分離します。

選択はあなた次第です。

于 2012-08-24T18:34:58.080 に答える
-1

あなたが持っているようなクエリ理解構文を使用してそれを行うのはかなり難しいですが、クエリ理解構文を使用してクエリを実行する前に、いつでもロジックを引き出して別のIQueryableを作成できます。

var products = ftjent.AssociationProducts;
if (affiliationID != null)
    products = products.Where(x => x.AffiliationID = affiliationID);

var associations = (
    from a in ftjent.Associations
    join ap in products on a.AssociationID equals ap.AssociationID
    where ap.Product.Name == productName
    select new
    {
        a.Acronym,
        a.AssociationID,
        a.Name
    }
)
.Distinct()
.OrderBy(assoc => assoc.Acronym);
于 2012-08-24T18:34:55.673 に答える