C# FromSqlInterpolated IN子句

C# FromSqlInterpolated IN子句,c#,entity-framework-core,ef-core-3.1,C#,Entity Framework Core,Ef Core 3.1,如何在子句中正确使用FromSqlInterpolated方法?假设我有一个带字符串参数的数组。使用SQLRAW的FromSqlRaw我不会有任何问题(至少对于整数参数),但是当我有字符串时,我希望是安全的 Context.Int32Query.FromSqlInterpolated($@" select Count(*) as value from table where field in ({string.Join(",", intArray

如何在子句中正确使用
FromSqlInterpolated
方法?假设我有一个带字符串参数的数组。使用SQLRAW的
FromSqlRaw
我不会有任何问题(至少对于整数参数),但是当我有字符串时,我希望是安全的

Context.Int32Query.FromSqlInterpolated($@"  
    select Count(*) as value from table
    where field in ({string.Join(",", intArray)}) and field2 in ({string.Join(",", stringArray)})")
若我省略字符串连接并只传递数组,我仍然会得到错误

解决方案(根据@ErikEJ链接)

我创建下一个类来简化我的生活

internal class SqlParameterData
{
    static readonly Dictionary<Type, DbType> typeMap = new Dictionary<Type, DbType>();
    static SqlParameterData()
    {
        typeMap[typeof(byte)] = DbType.Byte;
        typeMap[typeof(sbyte)] = DbType.SByte;
        typeMap[typeof(short)] = DbType.Int16;
        typeMap[typeof(ushort)] = DbType.UInt16;
        typeMap[typeof(int)] = DbType.Int32;
        typeMap[typeof(uint)] = DbType.UInt32;
        typeMap[typeof(long)] = DbType.Int64;
        typeMap[typeof(ulong)] = DbType.UInt64;
        typeMap[typeof(float)] = DbType.Single;
        typeMap[typeof(double)] = DbType.Double;
        typeMap[typeof(decimal)] = DbType.Decimal;
        typeMap[typeof(bool)] = DbType.Boolean;
        typeMap[typeof(string)] = DbType.String;
        typeMap[typeof(char)] = DbType.StringFixedLength;
        typeMap[typeof(Guid)] = DbType.Guid;
        typeMap[typeof(DateTime)] = DbType.DateTime;
        typeMap[typeof(DateTimeOffset)] = DbType.DateTimeOffset;
        typeMap[typeof(byte[])] = DbType.Binary;
        typeMap[typeof(byte?)] = DbType.Byte;
        typeMap[typeof(sbyte?)] = DbType.SByte;
        typeMap[typeof(short?)] = DbType.Int16;
        typeMap[typeof(ushort?)] = DbType.UInt16;
        typeMap[typeof(int?)] = DbType.Int32;
        typeMap[typeof(uint?)] = DbType.UInt32;
        typeMap[typeof(long?)] = DbType.Int64;
        typeMap[typeof(ulong?)] = DbType.UInt64;
        typeMap[typeof(float?)] = DbType.Single;
        typeMap[typeof(double?)] = DbType.Double;
        typeMap[typeof(decimal?)] = DbType.Decimal;
        typeMap[typeof(bool?)] = DbType.Boolean;
        typeMap[typeof(char?)] = DbType.StringFixedLength;
        typeMap[typeof(Guid?)] = DbType.Guid;
        typeMap[typeof(DateTime?)] = DbType.DateTime;
        typeMap[typeof(DateTimeOffset?)] = DbType.DateTimeOffset;
    }

    internal SqlParameterData(List<SqlParameter> sqlParameters, string[] parameters)
    {
        SqlParameters = sqlParameters;
        ParametersNames = new List<string[]> { parameters };
    }

    public List<SqlParameter> SqlParameters { get; }
    public  List<string[]> ParametersNames { get; }

    internal SqlParameterData CombineWith<T>(params T[] items)
    {
        var data = Create(SqlParameters.Count, items);

        SqlParameters.AddRange(data.SqlParameters);
        ParametersNames.Add(data.ParametersNames[0]);

        return this;
    }
    public string JoinNamesAt(int index)
    {
        return string.Join(",", ParametersNames[index]);
    }

    public static SqlParameterData Create<T>(params T[] items)
    {
        return Create(0, items);
    }

    private static SqlParameterData Create<T>(int firstParameterIndex, params T[] items)
    {
        var parameters = new string[items.Length];
        var sqlParameters = new List<SqlParameter>();
        for (var i = 0; i < items.Length; i++)
        {
            parameters[i] = string.Format("@p{0}", i + firstParameterIndex);
            var parameter = new SqlParameter(parameters[i], items[i])
            {
                DbType = typeMap[typeof(T)]
            };
            sqlParameters.Add(parameter);
        }

        return new SqlParameterData(sqlParameters, parameters);
    }
}
其他信息

 internal DbSet<OneValueEntity<int>> Int32Query { get; set; }

 public sealed class OneValueEntity<T>
 {
    public T Value { get; set; }
 }
内部DbSet Int32Query{get;set;}
加盖公章的一级估价单位
{
公共T值{get;set;}
}

什么样的错误,请?@Sergey,我忘了,但你可以参考我的解决方案,查看我的问题更新它对你有效吗?@Sergey是的,有效
 internal DbSet<OneValueEntity<int>> Int32Query { get; set; }

 public sealed class OneValueEntity<T>
 {
    public T Value { get; set; }
 }