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;