1

1つの大きなEF4モデルを使用して、同じことをいくつか実行しようとしています。これは、個別のdbmlを使用してlinq2sqlで実行できます。私が遭遇した基本的な問題は、私に代わってエンティティに対するlinqの知識が非常に根本的に不足している可能性がありますが、結果参照を使用して、参照されているテーブル内のオブジェクトをどのように検索しますか?

たとえば、外部キーを介してすべてリンクされている4つのテーブルがあります。

概念的には、結果参照でforeachを使用してすべてのテーブルをホップできますが、かなり不器用に見えます。代わりにlinqを使用して以下のコードを記述するにはどうすればよいでしょうか。

            //Get book
            var book= db.books.SingleOrDefault(d => d.bookId == 286);

            //If no book, return
            if (book == null) return null;

            //Get the shelf associated with this book
            List<shelf> slist = new List<shelf>();

            foreach (reading r in book.readings)
            { 
                foreach (event re in r.events)
                {
                    slist.Add(re);
                }
            }
            List<event> bookevents = slist.Distinct().ToList();

            //Get the customers associated with the events
            List<int> clist = new List<int>();

            foreach (event eb in bookevents)
            {
                var cust = db.customers.Where(c => c.customerID == eb.inID || c.customerID == eb.outID).ToList();
                clist.AddRange(cust.Select(c => c.customerID));
            }

            //Return the list of customers
            return clist;

編集:他の人が同様の問題に遭遇した場合に備えて、これを投稿して、3つのステップにまとめました。これをよりエレガントに行う方法についてのコメントを歓迎します

        //Get book
        var book= db.books.SingleOrDefault(d => d.bookId == 286);

        //If no book, return
        if (book == null) return null;

        //Get the bookevents associated with this book
        var bookevents = (from reading in book.readings
                   select reading.events).SelectMany(e => e).Distinct();

        //Get the customers associated with the events
        var clist = (from be in bookevents
                    from c in db.customers
                    where c.customerID == be.inID || c.customerID == be.outID
                    select c.customerID).ToList();

        //Return the list of customers
        return clist;
4

1 に答える 1

2

これを試して:

var distinctEvents = (from event in db.events
               join reading in db.readings on event.readingID equals reading.readingID
               where reading.bookID == 286
               select event).Distinct();
               // if you want to see this bookID is present in Book table, you should add a join statement like "join book in db.books on reading.bookID == book.bookID"
var custIdList = from c in db.customers
                 from event in distinctsEvents
                 where c.customerID == event.inID || c.customerID == be.outID
                 select c.customerID;

return custIdList.ToList();
于 2012-08-04T18:25:18.233 に答える