-3

基本的に、これはデータレイヤーの私のコードです。コードの最後の行から 2 番目の行に問題があります。変数「distinctIdsWoring」を promoCodeValues リストに挿入しようとしていますが、エラーが発生します。

    public static List<PromotionalCodeValue> GetPromotionalCodeValues(string Platform)
    {
        SqlConnection conn = xxxConnection();
        SqlCommand comm = new SqlCommand("GetPromotionalCodeValues", conn);
        comm.CommandType = CommandType.StoredProcedure;

        comm.Parameters.AddWithValue("@Platform", Platform);

        conn.Open();

        List<PromotionalCodeValue> promoCodeValues = new List<PromotionalCodeValue>();

        try
        {
            SqlDataReader dataReader = comm.ExecuteReader();

            while (dataReader.Read())
            {
                promoCodeValues.Add(new PromotionalCodeValue(dataReader));
            }
        }
        finally
        {
            conn.Close();
        }

        promoCodeValues.Clear();

        var distinctIdsWorking = promoCodeValues.AsEnumerable()
                .Select(s => new
                {
                    id = s.Value,
                })
                .Distinct().ToList();

        promoCodeValues = distinctIdsWorking; //????????????????????????????

        return promoCodeValues;

    }

ありがとう

4

5 に答える 5

3

互換性のない型を持つものを割り当てdistinctIdsWorkingています。promoCodeValues

代わりに のIEqualityComparerオーバーロードを使用してみてくださいDistinct

public class PromotionalCodeEqualityComparer
    : IEqualityComparer<PromotionalCodeValue>
{
    public bool Equals(PromotionalCodeValue x, PromotionalCodeValue y)
    {
        return x.Value == y.Value;
    }

    public int GetHashCode(PromotionalCodeValue obj)
    {
        return obj.Value != null ? obj.Value.GetHashCode() : 0;
    }
}

使用法:

var distinctIdsWorking = promoCodeValues.Distinct(new PromotionalCodeEqualityComparer());

return distinctIdsWorking;

また、 which は何も返さず、ステートメントpromoCodeValuesが欠落しています。using

訂正:

var promoCodeValues = new List<PromotionalCodeValue>();

using(var connection = xxxConnection())
using(var command = new SqlCommand("GetPromotionalCodeValues", connection))
{
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.AddWithValue("@Platform", Platform);

    connection.Open();

    using(var reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            promoCodeValues.Add(new PromotionalCodeValue(reader));
        }
    }
}

return promoCodeValues.Distinct(new PromotionalCodeEqualityComparer()).ToList();
于 2013-11-14T15:58:42.027 に答える
2

distinctIdsWorkingは ではないため List<PromotionalCodeValue>、 に割り当てることはできませんpromoCodeValues

結果で ID ごとに 1 つのプロモーション コードのみを取得しようとしているようです。次のようなことを試してください:

public static List<PromotionalCodeValue> GetPromotionalCodeValues(string Platform)
{
    // This ensures that your connection gets closed even if there's
    // an exception thrown. No need for a try/finally
    using (SqlConnection conn = xxxConnection())
    {
        SqlCommand comm = new SqlCommand("GetPromotionalCodeValues", conn);
        comm.CommandType = CommandType.StoredProcedure;

        comm.Parameters.AddWithValue("@Platform", Platform);

        conn.Open();

        List<PromotionalCodeValue> promoCodeValues = new List<PromotionalCodeValue>();

        SqlDataReader dataReader = comm.ExecuteReader();

        while (dataReader.Read())
        {
            promoCodeValues.Add(new PromotionalCodeValue(dataReader));
        }

        promoCodeValues = 
            (from pc in promoCodeValues
            // Group by ID, then choose the first item from each group;
            // This is effectively the same as "DistinctBy" but requires
            // no extra methods or classes.
            group pc by pc.Value into g
            select g.First())
                .ToList();

        return promoCodeValues;
    }
}
于 2013-11-14T15:53:05.340 に答える
1

var distinctIdsWorking = promoCodeValues.AsEnumerable() .Select(s => new { id = s.Value, }) .Distinct().ToList();

注意深く見てください: Select(s => new { id = s.Value })ID フィールドのみを持つ匿名オブジェクトを生成するステートメントを介して、それは前のクラス ( PromotionalCodeValue) 以降ではありません。

必要なのは、 MoreLINQパッケージをインストールするか、そのフレームワークから切り取られたこのコード拡張を取得することだけです。

public static IEnumerable<TSource> DistinctBy<TSource, TKey> (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    HashSet<TKey> seenKeys = new HashSet<TKey>();
    foreach (TSource element in source)
    {
        if (seenKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}

そしてこれを使用してください:DistinctBy(x => x.ID)または複数のキーが必要な場合:DistinctBy(x => { x.ID, x.Name })

したがって、コードを次のように書き直すことができます。 var distinctIdsWorking = promoCodeValues.AsEnumerable().DistinctBy(code => code.Value).ToList();

于 2013-11-14T15:57:46.740 に答える
1

これを単純化するために、最初に等値比較子を作成します。

public class PromotionalCodeValueEqualityComparer :
    IEqualityComparer<PromotionalCodeValue>
{
    public bool Equals(PromotionalCodeValue x, PromotionalCodeValue y)
    {
        return x.Value == y.Value;
    }

    public int GetHashCode(PromotionalCodeValue x)
    {
        return x.Value.GetHashCode();
    }
}

そして、これを行うことができます:

return promoCodeValues.Distinct(new PromotionalCodeValueEqualityComparer());
于 2013-11-14T15:56:41.823 に答える