[英]Nhibernate DetachedCriteria: Find entities where a property's property match a value
[英]Where if there's a match
我有一个要从中选择的表,该表从登录名中记录“签名”。
该表如下所示:
| Int| VARCHAR | Guid | Bit | Int | NVARCHAR(MAX)
| ID | UserName | UserId | Signed | Rec | additional info etc...
| -- | -------- | ------ | ------ | --- | ---------------------
| 1 | Bob | 12 | 0 | 100 | sasdd
| 2 | Steve | 14 | 1 | 100 | asretg
| 3 | GROUP: 2 | 76 | 0 | 101 | This is a group of logins
| 4 | Bob | 12 | 1 | 101 | asdfasd
因此,第5列是对其进行签名的目标ID。
为特定用户(Bob)建立未签名项目的列表非常简单:
SELECT Rec FROM tbl_Sigs WHERE Signed = 0 And UserId = '12'
现在,我已将登录组添加到此列表中,如第3
项所示-在此示例中,该组中既包含登录名,又能够在代码中从登录名中拉出它有权访问的组,因此语句变为:
SELECT Rec FROM tbl_Sigs WHERE (Signed = 0 And UserId = '12')
OR UserId IN (76,77,78)
这可行,但是在示例中将选择记录100
和101
。
我只想为Bob选择记录100
,因为由于“ GROUP:2”(我将始终是未签名的),所以我有101
个匹配项,但是“ Bob”已经对记录101
了签名,因此不需要在他的清单中。
我不知道如何将该条件放入where子句中,但是一旦有了数据集,我就可以在C#中完成,但如果可能的话,我更喜欢纯SQL方法。
我认为您只需要一个NOT EXISTS子句?
DECLARE @tbl_Sigs TABLE (
ID INT,
UserName VARCHAR(50),
UserId INT, --Not a GUID!
Signed BIT,
Rec INT,
AdditionalInfo VARCHAR(MAX));
INSERT INTO @tbl_Sigs VALUES (1, 'Bob', 12, 0, 100, 'sasdd');
INSERT INTO @tbl_Sigs VALUES (2, 'Steve', 14, 1, 100, 'asretg');
INSERT INTO @tbl_Sigs VALUES (3, 'GROUP: 2', 76, 0, 101, 'This is a group of logins');
INSERT INTO @tbl_Sigs VALUES (4, 'Bob', 12, 1, 101, 'asdfasd');
--So column 5 is the target ID to which it's been signed.
--To build a list of unsigned items for a specific user (Bob) was pretty straight forward:
SELECT Rec FROM @tbl_Sigs WHERE Signed = 0 And UserId = '12';
--Now, I've added login groups to this list, as in item 3 - In this example, the group has both logins in it and I'm able in code to pull from the login, which group it has access to, so the statement becomes:
SELECT Rec FROM @tbl_Sigs r1 WHERE (Signed = 0 And UserId = '12') OR UserId IN (76, 77, 78)
AND NOT EXISTS (SELECT * FROM @tbl_Sigs r2 WHERE r2.Rec = r1.Rec AND r2.UserId = '12' AND r2.Signed = 1);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.