0

ネストされたモデル オブジェクトに項目があるかどうかを確認する方法。

すなわち。オブジェクト/ビューモデルがある場合:

    public class CarViewModel
    {
    public string Type { get; set; }
    public long ID { get; set; }
    public virtual IQueryable<Feature> Features { get; set; }
    }

    public class Feature
    {
    public string Offer { get; set; }
    public decimal Rate { get; set; }
    public virtual CarViewModel CarViewModel { get; set; }
    }

...そして、次のように入力されます。つまり、1 つの車のオブジェクトには 2 つの追加機能があり、もう 1 つの車のオブジェクトには追加機能がありません。

[
{"Type":"SoftTop","ID":1,
"Features":
    [{"Offer":"Alloys","Rate":"500"},{"Offer":"Standard","Rate":"100"}]},
{"Type":"Estate","ID":2,
"Features":[]}
]

したがって、私のコードでは、「車」に上記のデータを入力しました。

foreach (var car in Cars)
{
    if (!car.Features.Any())
    {
        car.Type = "Remove";
    }
 }

ただし、次のメッセージが表示されます: This method is not supported against a materialized query result.at the if (!car.Features.Any()) 行。

しようとすると同じエラーが発生しましたif (car.Features.Count()==0)

機能の数が 0 かどうかを確認する方法はありますか?

または、機能の数が0であるオブジェクトからアイテムを削除するlinqの方法はありますか?

ありがとうございました、

マーク

アップデート

viewModel を IEnumerable を使用するように変更してから、次のように変更しました。

cars=cars.Where(x => x.Feature.Count()>0).ToList();

100% 確実ではありませんが、うまくいくようです。これが「悪い」修正であるかどうかを誰かが言うことができれば、私はそれを感謝します.

ありがとう、マーク

4

2 に答える 2

0

修正に問題はないと思いますIQueryable<T>-LinqからDB(L2S、Entity Frameworkなど)に由来するものを使用している場合、次のようなものを使用する前に、Any()またはCount()尋ねるときに、それを具体化する必要があります中のこれらのもののためにforeach

これがなぜなのか - 私は実際には 100% 確実ではなく、この点でエラーが少し誤解を招くと思いますが、それが不平を言っているのは、どちらも実際にはまだ完全に評価され実行されていないということだと思います (つまり、Carsあなたコードに入っcar.Features()た時点でデータベースにアクセスし始めているだけです。foreach ...IQueryable<T>

ただし、より広い意味IQueryable<T>で、Viewmodels では使用しないことをお勧めします。使用する方がはるかに安全IEnumerable<T>です。たとえば、ビューをレンダリングするときに誤ってデータベース アクセスを開始する可能性はありません。

また、DataLayer やその他の場所からデータを返すときは、できるだけ早くデータを具体化し、実際にあるものの実際のリストを使用して先に進むことができるようにすることをお勧めします。将来の特定されていない時点でデータベース内の特定のものを探します:)したがって、DataLayersは返されるだけですIEnumerable<T>'s

何らかの理由で必要な場合は、いつでも IEnumerable を IQueryable にキャストできます...

于 2013-09-20T14:41:07.153 に答える