まず、カテゴリ テーブルが小さい場合は、テーブル全体を取得してメモリ内で選択する方がよい場合があります (おそらく pwsg の回答を使用します)。
テーブルが大きい場合は、Linq よりもストアド プロシージャの方が適している可能性があります。
しかし、本当にLinqでやりたいのなら、同じテーブルに結合を繰り返し追加するしか方法はないと思います。
以下は、あなたの関係が ParentID と Id と呼ばれるフィールドの間であると仮定しています。また、順序をわかりやすくするために、文字列のパーマリンクも変更しました。
最初に小さなヘルパー クラスが必要です
public class Info
{
public Category category;
public int? recordID;
}
次に、メインコード
string permalink ="computers1/hp/computers2";
var aliases = permalink.Split('/');
var query = dc.Categories.Where(r=>r.Alias == aliases[aliases.Length-1])
.Select(r=> new Info { category = r, recordID = r.ParentID});
for(int i = aliases.Length -2 ; i >= 0; i--)
{
string alias = aliases[i];
query = query.Join(dc.Categories ,
a => a.recordID , b => b.Id , (a,b) => new { a , b} )
.Where(r=>r.b.Alias == alias)
.Select(r=> new Info { category = r.a.category, recordID = r.b.ParentID});
}
return query.SingleOrDefault().category;
ご覧のとおり、結合のラムダ構文は (IMHO) 恐ろしく、私は通常それを回避しようとしますが、とにかくここでそれを回避することは考えられません。
私はそれをテストできないので、完全に間違っている可能性があります (ID、ParentID、または a と b を混同した可能性があります)。そのため、これをテストし、そのパフォーマンスをテストすることが重要です。
生成されたSQLは次のようになるはずだと思います
SELECT * from Categories AS t0
INNER JOIN Categories AS t1 ON t0.ParentID = t1.id
INNER JOIN Categories AS t2 ON t1.ParentID = t2.id
WHERE t2.Alias = 'computers1'
AND t1.Alias = 'hp'
AND t0.Alias = 'computers2'
セクションまたはエイリアスが多いほど、結合が多くなります。
すべてを確認したので、おそらくこのメソッドの使用を避けたいと思うでしょう -)