SQLite 按位查询到 EF Core Linq 版本?

SQLite bitwise query to EF Core Linq version?

所以,我知道我的 SQL 比我的 EF Core linq 好得多,所以我的起始查询只是一个 FromSQL,如下所示:

var links = context.PortalLinks.FromSql("SELECT * FROM portal_link WHERE grant_bits & {0} AND linkSet_id={1} ORDER BY sortKey",claim,0).ToList();

现在我正在尝试将其转换为正确的 linq 样式查询

var links = context.PortalLinks.Where(x => ((x.GrantBits & claim) != 0) && x.LinkSetId == 0).OrderBy(s => s.SortKey);

我想出了这个,但我很不高兴我被迫在 SQL 中显式测试 !=0 这是隐含的,虽然这个实例是无害的,但我可以想象在其他情况下,我可以在 C# 中表达的内容与我想在 SQL.

中表达的内容之间可能存在更……有趣的……不匹配

我想,是否有其他方法可以表达更惯用的 SQL 查询,让 Linq 解析那些不受 c# 自己关于什么构成有效逻辑的假设的约束?

我想弄清楚你所说的惯用语是什么意思...你可以在查询中使用 C# 6.0 的字符串插值并传递你的 var:

var links = context.PortalLinks.Where(x => ((x.GrantBits & claim) != Int32.Parse($"{myVar}")) && x.LinkSetId == Int32.Parse($"{myVar2}").OrderBy(s => s.SortKey);

请注意,我使用了字符串插值,因为没有简单的方法可以用整数实现此逻辑。

您可以参考此 以获取其他信息来源。


编辑:

现在我明白了你的问题,我可以解决你的问题:

但是,您描述的内容不适用于本机 LINQ 功能

有这个库可以帮助您扩展动态 linq 并实现您的目标:

Dynamic LINQ