gpt4 book ai didi

c# - SQLite 查询中的 "Apply joins is not supported"

转载 作者:行者123 更新时间:2023-12-04 13:03:31 25 4
gpt4 key购买 nike

我正在尝试将我的应用程序与 MS SQL Server 2014 数据库转换为 SQLite。
此查询在 SQL Server 上运行良好,但使用 SQLite,我遇到“不支持 APPLY JOINS”错误。

此错误仅存在于 *select ( & include) 查询中。

询问:

        public static IList<Projet> GetListByClientWithDetails(long IdClient)
{
IList<Projet> resultList = null;

using (FITSEntities db_context = new FITSEntities())
{
resultList = db_context.Projet.Where(s => s.IdClient == IdClient)
.Include(s => s.Cdts.Select(r => r.CdtFiches))
.Include(s => s.Cdts.Select(r => r.Sessions))
.Include(s => s.Fiches.Select(r => r.FicheVersions))
.ToList();
}
return resultList;
}

如果我评论这一行: .Include(s => s.Cdts.Select(r => r.CdtFiches))
        public static IList<Projet> GetListByClientWithDetails(long IdClient)
{
IList<Projet> resultList = null;

using (FITSEntities db_context = new FITSEntities())
{
resultList = db_context.Projet.Where(s => s.IdClient == IdClient)
// .Include(s => s.Cdts.Select(r => r.CdtFiches))
.Include(s => s.Cdts.Select(r => r.Sessions))
.Include(s => s.Fiches.Select(r => r.FicheVersions))
.ToList();
}
return resultList;
}

它运作良好。

如果我评论另一行: .Include(s => s.Cdts.Select(r => r.Sessions))
        public static IList<Projet> GetListByClientWithDetails(long IdClient)
{
IList<Projet> resultList = null;

using (FITSEntities db_context = new FITSEntities())
{
resultList = db_context.Projet.Where(s => s.IdClient == IdClient)
.Include(s => s.Cdts.Select(r => r.CdtFiches))
// .Include(s => s.Cdts.Select(r => r.Sessions))
.Include(s => s.Fiches.Select(r => r.FicheVersions))
.ToList();
}
return resultList;
}

它也很好用。

sqlite选择查询有什么特定的规则吗?

最佳答案

我知道这是一个旧线程,但我今天遇到了它,所以这是我给任何 future 读者的两分钱
这个有点非常规的错误要么是由于 SQLite 数据库的工作方式,要么是由于 EF 的 SQLite 提供程序的编写方式。
在这两种情况下,为了简单地“使查询工作”而修复此问题的希望不大。
但是,我发现有一种解决方法可以规避此问题。虽然它可能没有利用 EF 的强大功能,但它可以完成工作。
问题的核心
主要问题是这个 LINQ 查询试图 Include同一个一对多表上的两个一对多导航属性(在您的情况下, Cdts )。
尝试时 Include在“多层次”上,一种使用 Include 在纯 LINQ 中执行此操作的方法是扔一个 Select

resultList = db_context.Projet.Where(s => s.IdClient == IdClient)
.Include(s => s.Cdts.Select(r => r.CdtFiches))
.Include(s => s.Cdts.Select(r => r.Sessions))
在这里,我想您想同时包含 CdtFichesSessions这是 Cdt 上的一对多关系 table 。但是 SQLite 不喜欢那样(不过我不知道为什么,因为 SQLServer 对它很好)。
您需要做的是手动 Select您的根实体并使用 ToList 强制获取相关实体.这与 Include 获得的结果完全相同(虽然我怀疑后者效率更高)。
在你的情况下
resultList = db_context.Projet.Where(s => s.IdClient == IdClient)
.Select(_toDeepProjet)
.ToList()

private Projet _toDeepProjet(Projet p)
{
p.Cdts = p.Cdts.Select(_toDeepCdts).ToList();
return p;
}

private Cdts _toDeepCdts(Cdts c)
{
// Force the fetching of entities
// It is equivalent to writing two Includes in your original query
c.CdtFiches = c.CdtFiches.ToList();
c.Sessions = c.Sessions.ToList();
return c;
}
这很hacky。但它有效。

关于c# - SQLite 查询中的 "Apply joins is not supported",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46706521/

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