2

複雑になっているViewModel/PresentationModelを開発しています。

LinqクエリがIQueryable<UserPresentationModel>

MSSQLに対するEntityFrameworkの使用

セットをプレゼンテーション層に戻す前に、セットに対して任意の種類の反復を行うことは可能ですか?

            List<UserPresentationModel> list = new List<UserPresentationModel>();
            foreach (var person in listOfPeople)
            {
                UserPresentationModel u = new UserPresentationModel();
                int userUIStatus = GetColourStateOfPerson(person);
                u.FirstName = person.FirstName;
                u.UserUIStatus = userUIStatus;
                list.Add(u);
            }
            return list

これは常にN+1であるように感じられ、クエリを作成する遅延実行の利点を得ることができません。

または(そして私は自分の質問に答えていると思います)SQLセットベースの方法で考える必要がありますか?

4

3 に答える 3

0
return listOfPeople.AsEnumerable().Select(p => 
    new UserPresentationModel
    {
        FirstName = p.FirstName,
        UserUIStatus = GetColourStateOfPerson(p)
    }).AsQueryable();

listOfPeopleこれは、IQueryable最終的にデータベースに対して実行される であると想定しています。その場合は、AsEnumerable()SQL Server が何をすべきかわからないため、重要ですGetColourStateOfPerson()AsEnumerable()の式ツリーを強制IQueryable的に実行し、結果の行をデータベースから引き出してSelect()から、SQL Server とは対照的にコードで変換を適用します。

GetColourStateOfPerson()ストアド プロシージャまたはデータベース関数として実装できる場合は、省略AsEnumerable()AsQueryable()て実行をさらに遅延させることができます。

于 2013-01-03T18:51:04.180 に答える
0

IEnumerable<T>.Aggregate()ループの代わりに使用します。

return listOfPeople.Aggregate(new List<UserPresentationModel>(), person => {
    return new UserPresentationModel {
         FirstName = person.FirstName,
         UserUIStatus = GetColourStateOfPerson(person)
    };
}).AsQueryable();
于 2013-01-03T18:47:55.173 に答える
0

まず、コードを LINQ に変換できます。

IEnumerable<UserPresentationModel> models =
    from person in listOfPeople
    select new UserPresentationModel
    {
        FirstName = person.FirstName,
        UserUIStatus = GetColourStateOfPerson(person)
    }

return models.ToList();

GetColourStateOfPersonが DB の往復を行っている場合は、それを引き出す必要があります。

IDictionary<int, int> colourStatesByPersonId = GetColourStatesOfPeople(listOfPeople);
IEnumerable<UserPresentationModel> models =
    from person in listOfPeople
    select new UserPresentationModel
    {
        FirstName = person.FirstName,
        UserUIStatus = colourStatesByPersonId[person.PersonId]
    }

return models.ToList();

おそらく、単一のクエリで必要な人の名と色の状態だけを取得する単一の LINQ クエリを作成することはできますが、データ コンテキストに関する十分な情報が提供されていないため、それを支援することができません。

個人的には、誰かが触れるたびにデータベースへのトリップを続ける可能性がある IQueryable を渡すことは避けたいと思います。データレイヤーで、必要になる可能性が高いすべてのデータを取得し、それをリストに構成して返します。

于 2013-01-03T18:49:01.473 に答える