我总是发现自己创建的linq表达式仍然大量使用嵌套的foreach循环。下面是我正在谈论的一个简单示例,如果这里有人可以向我展示如何将这种低效率代码压缩为单个linq表达式,我将不胜感激。

数据库上下文(db)具有三个表:Blog,Tag,Junc_Tag_Blog。联结表仅存储带有标签的博客记录。

无论如何,这是我的凌乱代码:

public static Collection<Blog> GetByTag(string tagName)
{
    // Get the tag record.
    var tag = (from t in db.Tags
              where t.Name == tagName
              select t).Single();

    // Get the list of all junction table records.
    var tagJunc = from tj in db.Junc_Tag_Blogs
                  where tj.Fk_Tag_Id == tag.Id
                  select tj;

    // Get a list of all blogs.
    var blogs = from b in db.BlogPosts
                select b;

    // Work out if each blog is associated with given tag.
    foreach(var blog in blogs)
    {
        foreach(var junc in tagJunc)
        {
            if(blog.Id == junc.Fk_Blog_Id)
            {
                // We have a match! - do something with this result.
            }
        }
    }
}


在此先感谢可以帮助我清理此代码的人!

最佳答案

您可以构造一个查询,让数据库为您找到匹配项。

List<Blog> blogs =
(
  from t in tag
  where t.Name == tagName
  from tj in t.Junc_Tag_Blogs
  let b = tj.Blog
  select b
).ToList();

10-06 12:17