gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:37:05 25 4
gpt4 key购买 nike

我试图在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com