【问题标题】:Entity Framework Simple Filter by NavigationProperty using LINQ Methods使用 LINQ 方法的 NavigationProperty 实体框架简单过滤器
【发布时间】:2012-04-13 18:24:46
【问题描述】:

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

我正在尝试从我的 2 个实体中进行非常简单的查询。

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

在我看来,这段代码应该可以工作:

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

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

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

我正在使用 C# 4 和 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?)

我该怎么办?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 如何在 linq 方法语法中进行 Join?你能看看我的编辑,看看我是否使用 .Any() 朝着正确的方向前进?
    【解决方案2】:

    看起来像这样:

     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));
     }
    

    那是我得到错误的时候。

    【讨论】:

    • 请问,你为什么不用LinQ表达式?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多