0

Entityframework と linq を使用して、SQL Server データベースから最初のアイテムだけを呼び出す最も効率的な方法を探しています。

私は現在使用しています

public static UserProfile GetUserProfile(Guid userID)
    {
        UserProfile oProfile = null;

        using (var context = new MyEntities())
        {
            var profiles = from c in context.UserProfiles where c.UserID == userID select c;

            if(profiles.Any())
            {
                oProfile = profiles.First();
            }
        }

        return oProfile;
    }

ただし、これは、完了するまでに 2 つの DB ops が必要であることがわかります。1 回目はレコードが存在するかどうかを確認し、2 回目はそれを返します。より良いパターン/方法が必要であると確信していますが、私はそれを見ていません。

4

4 に答える 4

4

とても簡単です: FirstOrDefault() を使用します。エントリがない場合は(すでにあるように) null を返し、それ以外の場合は最初のエントリを返します。変数が null 値を取りたくない場合は、その間に代用を使用します。

編集: コードは次のコードに等しく置き換えることができますが、これはデータベースに対して 1 回だけクエリを実行するだけです。

public static UserProfile GetUserProfile(Guid userID)
{
    UserProfile oProfile = null;

    using (var context = new MyEntities())
    {
        oProfile = (from c in context.UserProfiles where c.UserID == userID select c).FirstOrDefault();
    }

    return oProfile;
}
于 2012-07-26T14:28:08.003 に答える
1

(この場合のように)アイテムが1つだけ存在する必要がある場合は、Single()の使用を検討する必要があります。Singleは最初のアイテムを返しますが、複数のアイテムが存在する場合は例外をスローします。これは、単一のアイテムのみが存在する必要がある場合にデータ品質を維持するのに役立ちます。

アイテムが1つだけ存在する必要があるが、それがオプションである場合は、SingleOrDefaultを使用します。これは、シングルとして機能しますが、アイテムが存在しない場合はnullを返します。

于 2012-07-26T14:53:31.447 に答える
1

First()またはFirstOrDefault()呼び出しなしで使用する必要があります.Any()

var profile = (from c in context.UserProfiles where c.UserID == userID select c).First();

First()レコードが返されない場合は例外をスローしFirstOrDefault()ますが、その場合は null を返します

どちらも次のような SQL を生成します。

SELECT TOP (1) ...
FROM ...
于 2012-07-26T14:38:39.673 に答える
0

Take メソッドを使用する必要があります。

Entity Framework/Linq to SQL: スキップ & テイク

データベースへのヒットは 1 回だけで済みます。

于 2012-07-26T14:27:54.340 に答える