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