将我的sql数据库中的值与代码中的对象列表进行比较时遇到问题。
该对象在数据库中不存在
列表中对象的示例:
{
public long CompareId
public bool HasAccess
}
我在c#中使用SQLBuilder 然后我要进行如下查询:
在伪造的代码中
SELECT * FROM EntityPermission
WHERE EntityPermission.HasAccess = listOfObjects.Where(obj => obj.CompareId == EntityPermission.CompareId).HasAccess
使用SQL生成器创建的代码更多
query.WHERE("(EntityPermission.HasAccess = {0})", listOfObjects.Where(obj => obj.CompareId == EntityPermission.CompareId).HasAccess)
我完全意识到我在这里混合使用c#和sql,但这是解释我要完成的最好的方法。
用文字
我想要找到EntityPermission,其中HasAccess列等于它们具有相同ID的对象的HasAccess属性。
非常感谢您提供的所有帮助!
答案 0 :(得分:0)
您要查找的是SQL WHERE ... IN()语法。
如果您使用的是生成SQL的工具,那么您想要做的就是这样:
1)获取要比较的值列表
2)从他们那里创建一个如下所示的字符串:
"('value1','value2','value3')"
3)然后产生如下查询:
SELECT * FROM EntityPermission
WHERE EntityPermission.HasAccess
IN ('value1','value2','value3')
对于诸如实体框架,NHibernate等的ORM,您可以执行以下操作:
var results = db.EntityPermissions
.Where(x => listOfObjects
.Where(obj => obj.CompareId == EntityPermission.CompareId)
.Select(y => y.HasAccess)
.Contains(x.HasAccess))
答案 1 :(得分:0)
您可以使用表值参数和用户定义的类型,然后进行内部联接:
SELECT * FROM EntityPermission ep
INNER JOIN @foo f ON f.Id = ep.Id AND f.HasAccess = ep.HasAccess
但是,UDT和TVP的使用确实非常尴尬;坦白地说,我很想创建两个串联的字符串:
string with = string.Join(",", list.Where(x => x.HasAccess).Select(x => x.Id));
string without = string.Join(",", list.Where(x => !x.HasAccess).Select(x => x.Id));
并将其作为参数传递给string_split
:
SELECT *
FROM EntityPermission
WHERE (Id in (select value from string_split(@with, ',')) and HasAccess = 1)
OR (Id in (select value from string_split(@without, ',')) and HasAccess = 0)
答案 2 :(得分:0)
您可以先在结果表中获取sql查询,然后使用LINQ获取所需的值。我知道这不是最有效的方法,但是它可以工作。
public virtual List<YOUR_DTO> ExampleOperation(YOUR_DTO dto)
{
sqlText="SELECT * FROM EntityPermission ";
dbComm = db.GetSqlStringCommand(sqlText);
DataTable table = this.Database.ExecuteDataSet(dbComm).Tables[0];
List<YOUR_DTO> result = new List<YOUR_DTO>();
foreach (DataRow row in table.Rows)
{
result.Add(new YOUR_DTO()
{
...
});
}
//LINQ
result = result.Where(obj => obj.CompareId == EntityPermission.CompareId).HasAccess;
return result;
}
答案 3 :(得分:0)
我想要找到EntityPermission,其中HasAccess列等于具有相同ID的对象的HasAccess属性。
因此,您有一个表EntityPermissions
。该表中的每个EntityPermission
都至少具有一个布尔属性HasAccess
和一个长属性Id
的主键
此外,您还有一个对象列表,其中每个对象至少具有一个CompareId和一个HasAccess。
如果我正确地阅读了您的要求,则希望所有具有ID的EntityPermissions也在列表中,并且也是一个CompareId,并且具有相同的HasAccess值。
因此,如果您的列表中包含值:
{10, false}, {11, true}, {12, false},
您拥有EntityPermissiont:
Id HasAccess
09 true don't want this one, Id is not in the list
10 true don't want this one, Id is in the list, but HasAccess incorrect
11 true I want this one: Id is in the list, HasAccess is correct
12 false I want this one: Id is in the list, HasAccess is correct
通常,您将使用Where(x => y.Contains(x))
。问题在于,您只能在一个属性上进行选择。
var checkValues = new
{
new {CompareId = 10, HasAccess = false},
new {CompareId = 11, HasAccess = true},
new {CompareId = 12, HasAccess = false},
}
var result = dbContext.EntityPermissions.Select(entityPermission => new
{
ValueToCompare = new
{
CompareId = entityPermission.Id,
HasAccess = entityPermission.HasAccess,
},
Original = entityPermission,
})
// keep only those selected items that have a ValueToCompare in CheckValues
.Where(selectedItem => checkValues.Contains(selectedItem.ValueToCompare)
// from the remaining items, extract the original EntityPermission
.Select(selectedItem => selectedItem.Original);