c# - EntityFramework Linq Left Join 解析错误 - DotNet Core 1.0

标签 c# entity-framework linq .net-core

我试图在 linq 查询中使用左外连接显式连接 3 个表,但遇到了 linq 解析问题。执行内部联接可以正确解析并返回数据,但使用左外部联接会失败。

例子:

 var query = from p in DatabaseContext.Products
                    where p.ClientID == clientID
                    join l in DatabaseContext.Licenses on p.ProductID equals l.ProductID into pl
                    from pli in pl.DefaultIfEmpty()
                    join a in DatabaseContext.Articles on p.ArticleID equals a.ArticleID into pa
                    from pai in pa.DefaultIfEmpty()
                    select new SomeEntityDTO
                    {
                        SomethingFromP = p.Something,
                        SomethingFromL = pli.Something,
                        SomethingFromA = pai.Something
                    };

由于两个连接表都以第一个表为键,我可以通过删除另一个连接来单独测试每个表,例如,测试 p 到 l 的查询,然后测试 p 到 a 的查询。这些测试查询功能完美。也可以删除左外规则并获得正确的结果。

var query = from p in DatabaseContext.Products
                    where p.ClientID == clientID
                    join l in DatabaseContext.Licenses on p.ProductID equals l.ProductID 
                    join a in DatabaseContext.Articles on p.ArticleID equals a.ArticleID 
                    select new SomeEntityDTO
                    ... the rest ...

在 SQL Profiler 中查看有问题的查询(顶部代码示例)我看到前两个表已成功连接,例如:

SELECT p.Something, l.Something
FROM Products AS p
LEFT JOIN Licenses AS l ON p.ProductID = l.ProductID
WHERE p.ClientID = 5
ORDER BY p.ProductID

然后,在这个成功的查询之后,是另外 2 个查询(彼此相同):

SELECT a.ArticleID, a.Something, <all fields, even when not specified in query>
FROM Articles AS a
ORDER BY a.ArticleID

外部连接的 3 个表将成功返回一个对象,只要我不尝试访问“a”表中的字段。这样做时,我收到 Null Exception 错误,因为该表从未真正加入过。

如前所述,删除外部连接规则会返回一个成功连接的查询。

我试图调整 linq 查询,发现 Linq 解析器有问题,但无济于事:

var query = from p in DatabaseContext.Products
            from l in DatabaseContext.Licenses.Where(g => g.ProduktID == p.ProduktID).DefaultIfEmpty()
            from a in DatabaseContext.Articles.Where(g => g.ArticleID == p.ArticleID).DefaultIfEmpty()
            where ....

这将解析为一组根本不起作用的交叉应用,并且当复制到查询编辑器窗口中时,分析的查询根本不会运行(与分析器中看到的 3 个单独的查询相反)第一个代码示例)。我也尝试过更复杂的 lambda,但也不起作用。

这是 Linq 解析器中的错误吗?我这样做完全错了吗? (根据这里关于显式左外连接(而不是自然关联)的多个已回答问题,我做对了。但是,它没有正确解析。我避免创建关联,所以我可以在没有关联的情况下加入它们显式定义连接。这里可能需要吗?没有它就无法正常工作吗?

注意:每个表都有复杂的键,但我只需要根据单个键值进行连接(数据库是我无法更改的产品的一部分)。

使用。 DotNet Core、EntityFramework、EntityFrameworkCore.SqlServer等,均为1.0.1版本。

帮忙吗?

最佳答案

如果您绝对必须对您的实体进行复杂的 Linq 查询,那么简短的回答是使用 EF6 而不是 EFCore,即使在 1.1 版本之后也是如此。与 EF6 相比,EFCore 中仍然缺少太多东西。

路线图 here .

在我的例子中,我保留了 EFCore 并使用了 Context.Entity.FromSql(query) 方法来获取结果。这使我能够将 EFCore 用于大多数 EF 实体,从而保持对应用程序的前瞻性方法,同时允许不基于实际实体的复杂查询的特殊异常(exception)。计划是随着 EF Core 的成熟替换那些 FromSql 查询。

在决定使用 .FromSql 之前,我还在 View 和存储过程上测试了一个查询。在这两种情况下,我都失败了。对于存储过程,尚未实现命名参数,并且当前不支持 View ,除非您试图欺骗 EF 认为 View 实际上是一个表(这会带来自己的问题)。

为了访问 EF Core .FromSql,您需要安装以下包: Microsoft.EntityFrameworkCore.Relational

关于c# - EntityFramework Linq Left Join 解析错误 - DotNet Core 1.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40524620/

相关文章:

c# - 如何将单个字节转换为字符串

c# - Entity Framework 推断关系

c# - VS2013 调试器 + Entity Framework : "runtime has refused to evaluate the expression", 崩溃

c# - 生成的 LINQ 类中的继承?

C# HtmlEncode,然后使用 .innerHTML Javascript 插入

c# - 在正则表达式中排除匹配

c# - 在富文本框中创建换行符

c# - 为什么 Entity Framework 在后跟 distinct 时忽略 order by?

c# - Entity Framework 核心 : SqlException: A transport-level error has occurred when receiving results from the server

c# - 跟踪 Entity Framework 中删除的对象数量和类型的方法