Asp.net mvc ViewModel中的实体框架Lambda表达式和多对多关系

Asp.net mvc ViewModel中的实体框架Lambda表达式和多对多关系,asp.net-mvc,linq,entity-framework,Asp.net Mvc,Linq,Entity Framework,我是Linq to Entities的Lambda Expressions新手,希望在这里得到一些帮助 我在我的主页上使用ViewModel来显示文章列表,分为两列,位置和公司 article类的简化视图如下所示: public class Article { [Key] public int ArticleID { get; set; } public string Title { get; set; } public virtual ICollection

我是Linq to Entities的Lambda Expressions新手,希望在这里得到一些帮助

我在我的主页上使用ViewModel来显示文章列表,分为两列,位置和公司

article类的简化视图如下所示:

public class Article
{
    [Key]
    public int ArticleID { get; set; }

    public string Title { get; set; }

    public virtual ICollection<Location> Locations { get; set; }
    public virtual ICollection<Company> Companies { get; set; }

}
public class Location
{
    [Key]
    public int LocationID { get; set; }

    public string LocationName { get; set; }

    public virtual ICollection<Article> Articles { get; set; }
}
public class Company
{
    [Key]
    public int CompanyID { get; set; }

    public string CompanyName { get; set; }

    public virtual ICollection<Article> Articles { get; set; }
}
公共类文章
{
[关键]
公共int ArticleID{get;set;}
公共字符串标题{get;set;}
公共虚拟ICollection位置{get;set;}
公共虚拟ICollection公司{get;set;}
}
位置如下所示:

public class Article
{
    [Key]
    public int ArticleID { get; set; }

    public string Title { get; set; }

    public virtual ICollection<Location> Locations { get; set; }
    public virtual ICollection<Company> Companies { get; set; }

}
public class Location
{
    [Key]
    public int LocationID { get; set; }

    public string LocationName { get; set; }

    public virtual ICollection<Article> Articles { get; set; }
}
public class Company
{
    [Key]
    public int CompanyID { get; set; }

    public string CompanyName { get; set; }

    public virtual ICollection<Article> Articles { get; set; }
}
公共类位置
{
[关键]
public int LocationID{get;set;}
公共字符串位置名称{get;set;}
公共虚拟ICollection项目{get;set;}
}
最后,一家公司是这样的:

public class Article
{
    [Key]
    public int ArticleID { get; set; }

    public string Title { get; set; }

    public virtual ICollection<Location> Locations { get; set; }
    public virtual ICollection<Company> Companies { get; set; }

}
public class Location
{
    [Key]
    public int LocationID { get; set; }

    public string LocationName { get; set; }

    public virtual ICollection<Article> Articles { get; set; }
}
public class Company
{
    [Key]
    public int CompanyID { get; set; }

    public string CompanyName { get; set; }

    public virtual ICollection<Article> Articles { get; set; }
}
上市公司
{
[关键]
public int CompanyID{get;set;}
公共字符串CompanyName{get;set;}
公共虚拟ICollection项目{get;set;}
}
因此,我在文章和公司、文章和地点之间有一种多对多的关系。我想在我的页面上显示的是匹配位置列表的文章,以及单独匹配公司列表的文章

我有一个ViewModel:

public class HomePageViewModel
{
    public IEnumerable<Article> CompanyArticles { get; set; }
    public IEnumerable<Article> LocationArticles { get; set; }

}
公共类HomePageViewModel
{
公共IEnumerable CompanyArticles{get;set;}
公共IEnumerable LocationArticles{get;set;}
}
我正在努力使用Lambda表达式,根据我将提供的公司和地点列表返回文章。即:

    public ActionResult Index()
    {

        var Companies = new List<Company>
        {
            new Company {CompanyName ="foo"},
            new Company {CompanyName ="bar"}
        };

        var Locations= new List<Location>
        {
            new Location {LocationName ="UK"},
            new Location {LocationName ="US"}
        };
        var viewModel = new HomePageViewModel();

        viewModel.CompanyArticles = // what do I put here?
        viewModel.LocationArticles = // what do I put here?

        return View(viewModel);
    }
public ActionResult Index()
{
var公司=新名单
{
新公司{CompanyName=“foo”},
新公司{CompanyName=“bar”}
};
变量位置=新列表
{
新位置{LocationName=“UK”},
新位置{LocationName=“US”}
};
var viewModel=new HomePageViewModel();
viewModel.CompanyArticles=//我在这里放什么?
viewModel.LocationArticles=//我在这里放什么?
返回视图(viewModel);
}

提前感谢您的帮助

我真的认为你不需要你的ViewModel。因为在多对多关系之间没有其他信息

var articles = new List<Article>
{
    new Article {Title = "any1", Locations = new List<Location>(), 
                 Companies = new List<Company>()},
    new Article {Title = "any2", Locations = new List<Location>(), 
                 Companies = new List<Company>()}

};

articles[0].Companies.Add(Companies[0]);
articles[0].Locations.Add(Locations[0]);
var articles=新列表
{
新文章{Title=“any1”,位置=新列表(),
公司=新列表()},
新文章{Title=“any2”,位置=新列表(),
公司=新列表()}
};
文章[0]。公司。添加(公司[0]);
文章[0]。位置。添加(位置[0]);

我真的认为你不需要你的ViewModel。因为在多对多关系之间没有其他信息

var articles = new List<Article>
{
    new Article {Title = "any1", Locations = new List<Location>(), 
                 Companies = new List<Company>()},
    new Article {Title = "any2", Locations = new List<Location>(), 
                 Companies = new List<Company>()}

};

articles[0].Companies.Add(Companies[0]);
articles[0].Locations.Add(Locations[0]);
var articles=新列表
{
新文章{Title=“any1”,位置=新列表(),
公司=新列表()},
新文章{Title=“any2”,位置=新列表(),
公司=新列表()}
};
文章[0]。公司。添加(公司[0]);
文章[0]。位置。添加(位置[0]);

这应该是你想要的:

        viewModel.CompanyArticles = from a in db.Articles
                                    where
                                    (
                                    from c in a.Companies
                                    where InterestingCompanies.Contains(c.Name)
                                    select c
                                    ).Any()
                                    select a;


        viewModel.LocationArticles = from a in db.Articles
                                    where
                                    (
                                    from l in a.Locations
                                    where InterestingLocations.Contains(l.Name)
                                    select l
                                    ).Any()
                                    select a;

这应该是你想要的:

        viewModel.CompanyArticles = from a in db.Articles
                                    where
                                    (
                                    from c in a.Companies
                                    where InterestingCompanies.Contains(c.Name)
                                    select c
                                    ).Any()
                                    select a;


        viewModel.LocationArticles = from a in db.Articles
                                    where
                                    (
                                    from l in a.Locations
                                    where InterestingLocations.Contains(l.Name)
                                    select l
                                    ).Any()
                                    select a;

谢谢,但我想我需要一个Viewmodel,因为我正在视图中显示多个模型?我试图解决的另一个问题是linq查询,以按位置和公司列表获取所有文章-我看不出您的回答会如何显示这一点…谢谢,但我想我需要一个Viewmodel,因为我在视图中显示多个模型?我试图解决的另一个问题是linq查询,通过位置和公司列表获取所有文章-我看不出你的答案会如何向我显示…完美!正是我想要的。太好了!正是我想要的。