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

C# 到EF Core Linq版本的SQLite按位查询?,c#,linq,sqlite,ef-core-2.0,C#,Linq,Sqlite,Ef Core 2.0,因此,我比我的EF Core linq更了解我的SQL,所以我的起始查询只是一个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.

因此,我比我的EF Core linq更了解我的SQL,所以我的起始查询只是一个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);
我已经想到了这一点,但我不高兴,我被迫明确测试=0时,在SQL中这是隐式的,虽然这个实例是无害的,但我可以想象在其他情况下,会有更多。。。有趣的我可以用C#表达的内容与我想用SQL表达的内容不匹配


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

我正在试图理解您所说的惯用的。。。您可以在查询中使用C#6.0的字符串插值,并传递您的变量:

var links = context.PortalLinks.Where(x => ((x.GrantBits & claim) != Int32.Parse($"{myVar}")) && x.LinkSetId == Int32.Parse($"{myVar2}").OrderBy(s => s.SortKey);
请注意,我使用字符串插值,因为用整数实现这种逻辑并不容易

您可以将其与其他信息源联系起来


编辑:

既然我理解了你的问题,我可以回答你的询问:

但是,您所描述的与本机LINQ功能不兼容

此库将帮助您扩展动态linq并实现您的目标:


我的意思是,在SQL中,您可以期望“WHERE col&val“如果col和val的按位and不为零,则计算为true。我会将其标记为正确。考虑到所有因素,我认为处理生成的sql中的额外噪声以保持linq查询更具可读性更为实际。但是
int
按位
&
运算符返回
int
以及无法将
int
表达式隐式视为
bool
表达式是CLR习惯用法,而不是C#specific。此外,所有查询表达式都来自非C#特定的
Expression
类。最后,LINQ的思想是用面向对象的方式表达您所需要的内容,而不是用SQL(查询可能根本不针对SQL数据库),并让ORM查询转换器用SQL、其他东西或混合(如EF Core混合客户机/服务器查询求值)来表达它。