1

このコードは機能しますが、非常に遅いです。Entity Framework 5.0 を使用しています。では、Linq または Lambda のみを使用して、両方のコードを組み合わせて返すにはどうすればよいList<Entity> eでしょうか?

CMSEntities c = new CMSEntities();

var p = c.Entities.Where(
    x => x.Address != null
    && x.Address.AddressType != null
    && x.Address.AddressType.AddressTypeID == 1
    && x.Tags.FirstOrDefault() != null)
    .ToList();

List<Entity> e = new List<Entity>();

foreach (var a in p)
{
    var d = a.Tags.Where(y => y.Feature.FeatureID == 39).FirstOrDefault();

    if (d != null)
    {
        e.Add(a);
    }
}
4

3 に答える 3

3
var e = c.Entities.Where(
                         x => x.Address != null
                           && x.Address.AddressType != null
                           && x.Address.AddressType.AddressTypeID == 1
                           && x.Tags.FirstOrDefault(y => y.Feature.FeatureID == 39) != null
                        ).ToList();

1 つのクエリで直接実行できます。しかし、それが大きな速度の違いを生むかどうかはわかりません。

コメントでのジョンの提案によると、これはAnyの代わりに使用することで読みやすくなりFirstOrDefaultます。お気に入り:

var e = c.Entities.Where(
                         x => x.Address != null
                           && x.Address.AddressType != null
                           && x.Address.AddressType.AddressTypeID == 1
                           && x.Tags.Any(y => y.Feature.FeatureID == 39)
                        ).ToList();
于 2013-10-20T16:53:25.427 に答える
1

.ToList() 呼び出しを取り除くだけで、パフォーマンスが大幅に向上するはずです。

于 2013-10-20T16:53:05.260 に答える
0

「null」チェックは不要だと思いますが、EDM/DataModel を見ない限り、これは単なる憶測です。

var e = c.Entities.Where(
                     x => x.Address.AddressType.AddressTypeID == 1
                       && x.Tags.Any(y => y.Feature.FeatureID == 39)
                    );
 foreach (var a in p)
        {
            var d = a.Tags.Where(y => y.Feature.FeatureID == 39).FirstOrDefault();

            if (d != null)
            {
                e.Add(a);
            }
        }
于 2013-10-20T17:01:13.100 に答える