将 sql 与查询中的 c# 列表进行比较?
Comparing sql with c# list in query?
我在将 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 属性。
非常感谢大家的帮助!
您要查找的是 SQL WHERE...IN () 语法。
如果您使用的是生成 SQL 的工具,您想要做的是这样的:
1) 获取要比较的值列表
2) 从它们创建如下字符串:
"('value1','value2','value3')"
3) 然后生成如下所示的查询:
SELECT * FROM EntityPermission
WHERE EntityPermission.HasAccess
IN ('value1','value2','value3')
对于 Entity Framework、NHibernate 等 ORM,您可以执行以下操作:
var results = db.EntityPermissions
.Where(x => listOfObjects
.Where(obj => obj.CompareId == EntityPermission.CompareId)
.Select(y => y.HasAccess)
.Contains(x.HasAccess))
您可以使用table值参数和用户定义类型执行此操作,然后进行内部联接:
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)
您可以先在结果中获取 sql 查询 table,然后使用 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;
}
I want to find the EntityPermission where the HasAccess column is equal to the HasAccess property of the object where they have the same Id.
所以你有一个 table EntityPermissions
。这个table中的每个EntityPermission
至少有一个布尔值属性HasAccess
,和一个long 属性Id
中的主键
此外,您还有一个对象列表,其中每个对象至少有一个 CompareId 和一个 HasAccess。
如果我没看错您的要求,您希望所有 EntityPermissions 的 ID 在您的列表中也是一个 CompareId,并且具有相等的 HasAccess 值。
因此,如果您的列表具有以下值:
{10, false}, {11, true}, {12, false},
并且您拥有 EntityPermission:
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))
。问题是这样你只能 select 一个 属性.
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);
我在将 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 属性。
非常感谢大家的帮助!
您要查找的是 SQL WHERE...IN () 语法。
如果您使用的是生成 SQL 的工具,您想要做的是这样的:
1) 获取要比较的值列表
2) 从它们创建如下字符串:
"('value1','value2','value3')"
3) 然后生成如下所示的查询:
SELECT * FROM EntityPermission
WHERE EntityPermission.HasAccess
IN ('value1','value2','value3')
对于 Entity Framework、NHibernate 等 ORM,您可以执行以下操作:
var results = db.EntityPermissions
.Where(x => listOfObjects
.Where(obj => obj.CompareId == EntityPermission.CompareId)
.Select(y => y.HasAccess)
.Contains(x.HasAccess))
您可以使用table值参数和用户定义类型执行此操作,然后进行内部联接:
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)
您可以先在结果中获取 sql 查询 table,然后使用 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;
}
I want to find the EntityPermission where the HasAccess column is equal to the HasAccess property of the object where they have the same Id.
所以你有一个 table EntityPermissions
。这个table中的每个EntityPermission
至少有一个布尔值属性HasAccess
,和一个long 属性Id
此外,您还有一个对象列表,其中每个对象至少有一个 CompareId 和一个 HasAccess。
如果我没看错您的要求,您希望所有 EntityPermissions 的 ID 在您的列表中也是一个 CompareId,并且具有相等的 HasAccess 值。
因此,如果您的列表具有以下值:
{10, false}, {11, true}, {12, false},
并且您拥有 EntityPermission:
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))
。问题是这样你只能 select 一个 属性.
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);