.net core SQL';AS';从EntityFrameworkCore 2.1升级并中断代码时添加的关键字
我已经做了好几天了,准备放弃 我继承了一个使用2.1的.NET核心项目,包括EntityFrameworkCore 2.1 我在代码中有一个EF查询,每当我触摸版本号时就会抛出一个异常(我曾尝试使用2.2,但甚至尝试了2.1.11甚至2.1.1!).net core SQL';AS';从EntityFrameworkCore 2.1升级并中断代码时添加的关键字,.net-core,entity-framework-core,.net Core,Entity Framework Core,我已经做了好几天了,准备放弃 我继承了一个使用2.1的.NET核心项目,包括EntityFrameworkCore 2.1 我在代码中有一个EF查询,每当我触摸版本号时就会抛出一个异常(我曾尝试使用2.2,但甚至尝试了2.1.11甚至2.1.1!) SqlException:关键字“AS”附近的语法不正确。 因此,我决定查看将要运行的语句的控制台日志,我可以看到一个区别,它只在我更新EntityFrameworkCore时出现,但在网上找不到任何东西来记录或帮助我 原始查询如下所示开始: SEL
SqlException:关键字“AS”附近的语法不正确。
因此,我决定查看将要运行的语句的控制台日志,我可以看到一个区别,它只在我更新EntityFrameworkCore时出现,但在网上找不到任何东西来记录或帮助我
原始查询如下所示开始:
SELECT [WebsiteCategory].[CategoryID], [WebsiteCategory].[WebSiteID], CASE
WHEN [t].[Name] IS NULL OR ([t].[Name] = N'')
THEN [WebsiteCategory.Category].[Category] ELSE [t].[Name]
在升级(甚至仅仅升级到2.1.1)之后,我看到了这一点
SELECT [WebsiteCategory].[CategoryID], [WebsiteCategory].[WebSiteID], CASE
WHEN [t].[Name] AS [Name0] IS NULL OR ([t].[Name] AS [Name0] = N'')
THEN [WebsiteCategory.Category].[Category] ELSE [t].[Name] AS [Name0]
这个变化是一个神秘的,因为[Name0]
不知从哪里冒出来
不幸的是,我的SQL不是很强,我只需要使用基本的SELECT查询,因为我的大部分开发都使用EntityFramework
有什么想法吗?这阻碍了我们升级到2.2,我担心这将意味着我们再也不会升级EntityFramework了
编辑:Linq查询是
return\u productRepository.Context.WebSiteCategory
.GroupJoin(_productRepository.Context.CategoryTranslations
.Where(z=>z.Locale==culture.Name),
WebsiteCategory=>WebsiteCategory.CategoryId,
Translation=>Translation.CategoryId,
(x,y)=>new{websitegority=x,Translation=y})
.SelectMany(
xy=>xy.Translation.DefaultIfEmpty(),
(x,翻译)=>新{x.websitegority,Translation})
。选择(s=>new
{
s、 网站类别,
s、 翻译
})
.Where(x=>websiteIds.Contains(x.websitegority.WebSiteId))
.选择(x=>new
{
x、 WebsiteCategory.CategoryId,
x、 WebsiteCategory.WebSiteId,
x、 WebsiteCategory.Category.Category,
x、 翻译。姓名,
x、 WebsiteCategory.Category.CategorySeo,
x、 WebsiteCategory.Category.Order
})
.GroupBy(x=>new
{
x、 类别,
x、 网站ID,
x、 类别,
x、 名字,
x、 分类,
x、 命令
})
.选择(x=>new ProductCategoryTo
{
CategoryId=x.Key.CategoryId,
WebSiteId=x.Key.WebSiteId,
Category=string.IsNullOrEmpty(x.Key.Name)?x.Key.Category:x.Key.Name,
CategorySEO=x.Key.CategorySEO,
订单=x.Key.Order
})
.OrderBy(x=>x.Order)
.ToList();
我能够用类似的LINQ查询形状重现问题。问题是由表达式引起的
string.IsNullOrEmpty(x.Key.Name) ? x.Key.Category : x.Key.Name
在GroupBy
之后。表达式的实际类型不是必需的,它似乎发生在除属性访问或聚合方法之外的任何表达式中
显然这是EF核心回归错误。我所能说的是,他们一直在进行查询转换,当然还有GroupBy
优化。然而,随着改进,不幸的是,它们引入了回归。在(如果)他们修复之前,除了寻找解决办法,你什么都做不了
解决方法是在GroupBy
之后预先选择这些表达式或将它们嵌入GroupBy
键中,以避免在GroupBy
之后出现此类表达式。例如,将示例查询更改为
.GroupBy(x => new
{
x.CategoryId,
x.WebSiteId,
Category = string.IsNullOrEmpty(x.Name) ? x.Category : x.Name, // <--
x.Name,
x.CategorySeo,
x.Order
})
.Select(x => new ProductCategoryDTO
{
CategoryId = x.Key.CategoryId,
WebSiteId = x.Key.WebSiteId,
Category = x.Key.Category, // <--
CategorySEO = x.Key.CategorySeo,
Order = x.Key.Order
})
.GroupBy(x=>新建)
{
x、 类别,
x、 网站ID,
Category=string.IsNullOrEmpty(x.Name)?x.Category:x.Name,//new ProductCategoryTo
{
CategoryId=x.Key.CategoryId,
WebSiteId=x.Key.WebSiteId,
Category=x.Key.Category,//您能显示LINQ查询示例吗?这可能是一个与查询模式相关的错误/问题,但为了更具体,我需要能够复制它。添加-但我不明白为什么它在2.1版本中工作,而不是更高版本!绝对英雄。您刚刚保存了我的周日下午:)这正是问题所在,我可以通过一个更精确的谷歌搜索看到,微软已经意识到了这一点,并计划在3.0中解决它。