0

クエリからリストに追加情報を追加するためのより効率的な方法を見つけようとしています。たとえば、ObjectIDとStringAが設定されたオブジェクトのリストがある場合、ObjectIDに基づいてデータベースにクエリを実行し、StringBとStringCを取得します。

public class SomeObject {
    public int ObjectID { get; set; }
    public string StringA { get; set; }
    public string StringB { get; set; }
    public string StringC { get; set; }
}

public void AddInformationToSomeObjects(List<SomeObject> someObjects)
{
    var listOfIDs = someObjects.Select(so => so.ObjectID).ToList();
    var informationToAdd = db.Table.Where(t => listOfIDs.Contains(t.ObjectID)).Select(t => new { ObjectID = t.ObjectID, StringB = t.StringB, StringC = t.StringC }).ToList();

    foreach (var someObject in someObjects)
    {
        var information = informationToAdd.Where(i => i.ObjectID == someObject.ObjectID).FirstOrDefault();
        someObject.StringB = information.StringB;
        someObject.StringC = information.StringC;
    }
}

クエリと割り当てを1つのステートメントに結合する方法はありますか?

4

2 に答える 2

1

全体を更新するだけListです...

public void AddInformationToSomeObjects(IEnumerable<SomeObject> someObjects)
{
    someObjects =
        from obj in someObjects
        join dbObj in db.Table
        on obj.ObjectID equals dbObj.ObjectID
        select new SomeObject
        {
            ObjectID = obj.ObjectID,
            StringA = obj.StringA,
            StringB = dbObj.StringB,
            StringC = dbObj.StringC
        }
}
于 2012-10-18T12:37:12.070 に答える
0

Jan P.が言うように、新しいリストを再フェッチするだけでは大したことではないかもしれません。しかし、最初のリストを取得するには、いくつかの高価な操作(blobのフェッチなど)が必要でしたが、あなたのアイデアはまったく悪くありません。単純な結合が行うように:

public List<SomeObject> AddInformationToSomeObjects(List<SomeObject> someObjects)
{
    var listOfIDs = someObjects.Select(so => so.ObjectID).ToList();
    var informationToAdd = db.Table
        .Where(t => listOfIDs.Contains(t.ObjectID))
        .Select(t => new { 
                            ObjectID = t.ObjectID,
                            StringB = t.StringB,
                            StringC = t.StringC
                        }).ToList();

    return(
        from org in someObjects
        join a in informationToAdd on org.ObjectID equals a.ObjectID
        select new SomeObject {
                                ObjectID = org.ObjectID,
                                StringA = org.StringA,
                                StringB = a.StringB,
                                StringC = a.StringC
                            }).ToList();
}

元のリストを変更せずに新しいリストを返すことは、個人的な好みです(メソッド/関数の副作用を最小限に抑えます)。

于 2012-10-18T18:20:45.793 に答える