我在比较sql数据库中的值和代码中的对象列表时遇到问题。
对象在数据库中不存在
列表中的对象示例:
{
public long CompareId
public bool HasAccess
}
我在c#中使用sqlbuilder,然后我想进行如下查询:
编造代码
SELECT * FROM EntityPermission
WHERE EntityPermission.HasAccess = listOfObjects.Where(obj => obj.CompareId == EntityPermission.CompareId).HasAccess
在更复杂的代码中,但使用sql builder
query.WHERE("(EntityPermission.HasAccess = {0})", listOfObjects.Where(obj => obj.CompareId == EntityPermission.CompareId).HasAccess)
我很清楚我在这里混合了c#和sql,但这是解释我想要实现什么的最好方法。
用词
我想找到一个entitypermission,其中hasaccess列等于具有相同id的对象的hasaccess属性。
非常感谢大家的帮助!
4条答案
按热度按时间gc0ot86w1#
您要查找的是sql where…in()语法。
如果您使用的是生成sql的工具,则需要执行以下操作:
1) 获取要比较的值的列表
2) 从它们中创建如下字符串:
3) 然后生成如下所示的查询:
对于类似orm的实体框架、nhibernate等,可以执行以下操作:
yuvru6vn2#
可以使用表值参数和用户定义的类型,然后使用内部联接:
然而:UDT和TVP确实很难使用;坦白地说,我很想创建两个串联的字符串:
并将其作为参数传递给
string_split
:tyg4sfes3#
您可以首先在结果表中获取sql查询,然后使用linq获取所需的值。我知道这不是最有效的方法,但它可以工作。
b4lqfgs44#
我想找到一个entitypermission,其中hasaccess列等于具有相同id的对象的hasaccess属性。
你有table吗
EntityPermissions
. 每EntityPermission
此表中至少有一个布尔属性HasAccess
,以及long属性中的主键Id
此外,您还有一个对象列表,其中每个对象至少有一个compareid和一个hasaccess。如果我正确地阅读了您的需求,那么您需要所有的entitypermissions,其id也是列表中的compareid,并且具有相等的hasaccess值。
因此,如果列表中有值:
你有全部权限:
通常你会用
Where(x => y.Contains(x))
为了这个。问题是,使用此选项只能选择一个属性。