C# 在查询中比较sql和c列表?

C# 在查询中比较sql和c列表?,c#,sql,linq,.net-core,sqlbuilder,C#,Sql,Linq,.net Core,Sqlbuilder,我在比较sql数据库中的值和代码中的对象列表时遇到问题 该对象在数据库中不存在 列表中的对象示例: { public long CompareId public bool HasAccess } 我在c中使用SQLBuilder 然后我想做一个这样的查询: SELECT * FROM EntityPermission WHERE EntityPermission.HasAccess IN ('value1','value2','value3') 编码 在更复杂的代码中,但使用

我在比较sql数据库中的值和代码中的对象列表时遇到问题

该对象在数据库中不存在

列表中的对象示例:

{
    public long CompareId
    public bool HasAccess
}
我在c中使用SQLBuilder 然后我想做一个这样的查询:

SELECT * FROM EntityPermission
WHERE EntityPermission.HasAccess
IN ('value1','value2','value3')
编码

在更复杂的代码中,但使用sql builder

我完全知道我在这里混合了c和sql,但这是我能够解释我想要实现什么的最好方式

用词

我想找到EntityPermission,其中HasAccess列等于具有相同Id的对象的HasAccess属性


非常感谢所有的帮助

您要查找的是语法中的SQL WHERE

如果您使用的是生成SQL的工具,则需要执行以下操作:

SELECT * FROM EntityPermission
WHERE EntityPermission.HasAccess
IN ('value1','value2','value3')
1获取要比较的值列表

2从中创建一个字符串,如下所示:

"('value1','value2','value3')"
3然后生成一个如下所示的查询:

SELECT * FROM EntityPermission
WHERE EntityPermission.HasAccess
IN ('value1','value2','value3')
对于类似ORM的实体框架、NHibernate等,可以执行以下操作:

var results = db.EntityPermissions
                .Where(x => listOfObjects
                           .Where(obj => obj.CompareId == EntityPermission.CompareId)
                .Select(y => y.HasAccess)
                .Contains(x.HasAccess))
可以使用表值参数和用户定义的类型,然后使用内部联接:

从EntityPermission ep中选择* 内部连接@foo f ON f.Id=ep.Id和f.HasAccess=ep.HasAccess 然而:UDT和TVP真的很难使用;坦率地说,我很想创建两个串联字符串:

string with=string.Join,,list.Wherex=>x.HasAccess.Selectx=>x.Id; 不带字符串的字符串=string.Join,,list.Wherex=>!x、 HasAccess.Selectx=>x.Id; 并将其作为参数向下传递,以便与字符串_split一起使用:

挑选* 从整体上看 其中Id位于从字符串中选择值_split@with,','和HasAccess=1 或从字符串中选择值中的Id_split@without,“,”和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;
        }
我想找到EntityPermission,其中HasAccess列等于具有相同Id的对象的HasAccess属性

所以你有一张桌子。此表中的每个EntityPermission至少有一个布尔属性HasAccess和一个长属性Id中的主键

此外,您还有一个对象列表,其中每个对象至少有一个CompareId和一个HasAccess

如果我正确阅读了您的需求,那么您需要所有Id为的EntityPermission,该Id也是列表中的一个比较Id,并且具有相等的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
通常情况下,您会使用Wherex=>y.Containsx进行此操作。问题是,使用此选项只能选择一个属性

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);

什么是对象列表?它是数据库中的另一个实体吗?你只需要做一个连接就可以得到你需要的数据。它不是我数据库中的另一个实体,它来自一个输入。所以它只是一个存在于代码中的值,你在这里要做的,本质上需要一个表变量或表值参数的内部连接;从本质上讲,尴尬的一点是:将listOfObjects放到DB中——listOfObjects有多少位?这取决于20个与2000个与200000个之间是否存在差异。对象列表可能有500个实体,可能更多