[英]Comparing sql with c# list in query?
我將 sql 數據庫中的值與我的代碼中的 object 列表進行比較時遇到問題。
DB中不存在object
列表中的 object 示例:
{
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 ,但這是我可以解釋我想要完成的最佳方式。
用言語
我想找到 HasAccess 列等於 object 的 HasAccess 屬性的 EntityPermission,它們具有相同的 Id。
真的很感謝大家的幫助!
您正在尋找的是 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))
您可以使用表值參數和用戶定義類型執行此操作,然后使用內部聯接:
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 查詢,然后使用 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;
}
我想找到 HasAccess 列等於 object 的 HasAccess 屬性的 EntityPermission,它們具有相同的 Id。
所以你有一個表EntityPermissions
。 此表中的每個EntityPermission
至少有一個 Boolean 屬性HasAccess
和一個長屬性Id
中的主鍵
此外,您還有一個對象列表,其中每個 object 至少有一個 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))
。 問題是你只能在一個屬性上使用 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.