实体框架使用LINQ方法通过NavigationProperty进行简单过滤

时间:2012-04-13 18:24:47

标签: linq entity-framework linq-to-entities linq-method-syntax

我正在学习EF和LINQ到EF。我们使用的是LINQ方法而不是LINQ表达式。

我正试图从我的2个实体做一个非常简单的查询。

NavigationGroup是NavigationGroupLocation的一对多关系。 NavigationGroup中的Navigation属性称为“NavigationGroupLocations”

在我看来,这段代码应该有效:

 List<NavigationGroup> groups = db.DataModel.NavigationGroups.Where(g => g.NavigationGroupLocations.Location == 1).ToList();

Location是我的NavigationGroupLocation实体中的一个int。

有人可以解释为什么这不起作用以及通过导航属性过滤的正确方法是什么?我在表达式语法中看到了许多示例,似乎无法将其与方法语法联系起来。

我正在使用C#4&amp; EF 4。

感谢您的帮助!

修改

我看到,由于我的导航属性是一个集合,我无法访问单个属性。所以我正在尝试这段代码:

 .Where(g => g.NavigationGroupLocations.Any(l => l.Location == 1));

当我尝试运行它时,我收到此错误:

 Cannot implicitly convert type 'System.Linq.IQueryable<ME.Data.ECom.NavigationGroup>' to 'System.Data.Objects.ObjectSet<ME.Data.ECom.NavigationGroup>'. An explicit conversion exists (are you missing a cast?)

我该怎么办?

2 个答案:

答案 0 :(得分:0)

你需要加入。 NavigationGroupLocations是项目列表,因此您无法在where子句中访问.Location属性。

答案 1 :(得分:0)

看起来这样有效:

 var query = db.DataModel.NavigationGroups.Where(g => g.NavigationGroupLocations.Any(l => l.Location == selectedLocation));

用作条件语句时不起作用。

 var query = db.DataModel.NavigationGroups;
 if (selectedLocation > 0)
 {
    query = query.Where(g => g.NavigationGroupLocations.Any(l => l.Location == selectedLocation));
 }

那是我收到错误的时候。