首先,如果类别表很小,有时最好只抓取整个表并在内存中进行选择(也许使用 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;
正如你所看到的,join 的 lambda 语法是(恕我直言)可怕的,我通常会尽量避免它,但无论如何我都想不出在这里避免它。
由于我无法测试它,它可能是完全错误的(可能我混淆了 ID、ParentID 或我的 a's 和 b's ),因此测试它并测试它的性能很重要。
我认为产生的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'
部分或别名越多,连接就越多。
既然您已经看到了所有这些,您可能希望避免使用这种方法 -)