1

最初に部分文字列を使用してトリミングされた個別の結果セットを返そうとしていますが、「選択」を呼び出すと、匿名型に変換されます。タイプ「リスト」を維持するためにこれを取得できないようです。Select メソッドで指定されたフィールドのみを返す必要があります。

public List<Facility> GetFacilities() {
    var facilities = new List<Facility>(); 
    facilities = _facilityRepository.GetAll().ToList();
    var facReturnList = 
        facilities.Where(x => x.Fac_Name = "Something")
                  .OrderBy(x => x.Fac_Name).ToList();

    var facReturnList2 = 
        facReturnList.Select(x => 
            new { ID = x.Fac_Name.Substring(0, 6), 
                  Fac_Name = x.Fac_Name.Substring(0, 3) })
            .Distinct().ToList();
    return facReturnList2;
}

List<Facility>afterを追加しようとしましたnewが、これらのプロパティ (IDおよびFac_Name) は施設で定義されていないと表示されます。

4

4 に答える 4

3

結果で新しいFacilityインスタンスを初期化しますか?

var facReturnList2 = facReturnList.Select(x => new Facility { ID =   // ...
                                                   ^ concrete type initializer

編集への応答: 演算子内で、初期化する要素のリストではなく、要素Selectの型を指定する必要があります。以前のコードは で定義されていることを示しているようですが明らかに で定義されていません。Fac_Name FacilityList<Facility>

于 2013-03-08T18:01:26.343 に答える
3

匿名型を作成しているため、匿名型を取得しています。

.Select(x => new {

あなたがそれを望まないなら、そうしないでください。

既存の型に必要な名前と正確なプロパティが既にある場合は、それを使用します。必要なタイプがない場合は、作成します。次に、そのタイプの適切なリストまたは列挙型を返すことができます。

.Select(x => new YourDefinedType { 
于 2013-03-08T18:01:11.473 に答える
2

本当に欲しいのはDistinctByメソッドのようです。オブジェクトが別個のものであることを示す何らかの手段を指定したいが、結果をその選択のコレクションにしたくはなく、最終結果を開始オブジェクトにしたい。LINQ にはDistinctByビルトインはありませんが、実装は簡単です。

public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer = null)
{
    comparer = comparer ?? EqualityComparer<TKey>.Default;
    HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
    foreach (TSource element in source)
    {
        if (knownKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}

それを使用すると、コードは次のようになります。

public List<Facility> GetFacilities()
{
    return _facilityRepository.GetAll()
        .Where(x => x.Fac_Name == "Something")
        .DistinctBy(x => new
        {
            ID = x.Fac_Name.Substring(0, 6),
            Fac_Name = x.Fac_Name.Substring(0, 3)
        })
        .OrderBy(x => x.Fac_Name)
        .ToList();
}

IQueryableメモリ内のデータ セットではなく がある場合は、 を使用GroupByして同じ動作を得ることができます。Linq-to-objects を使用GroupByすると効率が大幅に低下しますが、クエリ プロバイダーの場合はそうではありません。データベースはこれを最適化できるからです。

public List<Facility> GetFacilities()
{
    return _facilityRepository.GetAll()
        .Where(x => x.Fac_Name == "Something")
        .OrderBy(x => x.Fac_Name)
        .GroupBy(x => new
        {
            ID = x.Fac_Name.Substring(0, 6),
            Fac_Name = x.Fac_Name.Substring(0, 3)
        })
        .Select(group => group.First())
        .ToList();
}
于 2013-03-08T18:05:23.830 に答える
1

次のコードは、linq に匿名型を返すように指示しています。

.Select(x => new { ID = x.Fac_Name.Substring(0, 6), Fac_Name = x.Fac_Name.Substring(0, 3) }

結果のクラスを作成する必要があります

public class Result{
    public string ID { get;set; }
    public string Fac_Name { get; set; }
}

//Then do

.Select(x => new Result { ID = x.Fac_Name.Substring(0, 6), Fac_Name = x.Fac_Name.Substring(0, 3) }

これにより、必要な情報のみを返すことが保証されます

于 2013-03-08T18:01:28.870 に答える