目前使用ExecuteSqlInterpolatedAsync时无法获取查询结果。这同样适用于任何其他 LINQ 语句。
但是,您可以使用底层 ADO.net Provider:
public IList<IDictionary<string, dynamic>> SelectDynamic(string table)
{
using (var command = Database.GetDbConnection().CreateCommand())
{
command.CommandText = $"SELECT * FROM [{table}]";
command.CommandType = CommandType.Text;
Database.OpenConnection();
using (var result = command.ExecuteReader())
{
var entities = new List<IDictionary<string, dynamic>>();
while (result.Read())
{
var dict = new Dictionary<string, dynamic>();
for (int i = 0; i < result.FieldCount; i++)
{
dict.Add(result.GetName(i), result.GetValue(i));
}
entities.Add(dict);
}
return entities;
}
}
}
将此添加到您的 DbContext 类并调用它:
using (var context = new MyDbContext()) // Or get it with DI, depends on your application
{
var count = context.SelectDynamic("samaster").Where(d => d["CODE"] == productBrandCode && d["WAREHOUSE"] == warehouse).Count();
}
但是请注意,如果您的表中有很多行,这是一项昂贵的操作!
仅获取相关结果的另一种方法是替换
command.CommandText = $"SELECT * FROM [{table}]";
与
command.CommandText = $"SELECT CODE FROM [samaster] WHERE CODE={productBrandCode} AND WAREHOUSE={warehouse}";
并将参数作为函数参数传递。
public IList<IDictionary<string, dynamic>> SelectDynamic(string productBrandCode, string warehouse)
{...
如果用户输入以任何方式提交的所有参数,请确保对所有参数进行转义,以防止 SQL 注入攻击!