我有一个包含配置的表,有多种类型(存储在不同的列中),我需要根据泛型类型使用实体框架查询当前类型
我有两种方法1只是将所有内容都投射到(动态),基本上说我不需要在这里进行类型检查
看起来像这样
static TValue GetValueBasedOnType<TValue>(int configKey)
{
var query = dbcontext.Configurations.Where(c => c.configKey == configKey);
if(typeof(TValue) == typeof(bool))
return (dynamic)(query.Select(c => c.ValueBit).FirstOrDefault() ?? false);
if(typeof(TValue) == typeof(string))
return (dynamic)(query.Select(c => c.ValueText).FirstOrDefault());
if (typeof(TValue) == typeof(decimal))
return (dynamic)(query.Select(c => c.ValueDecimal).FirstOrDefault());
return default(TValue);
}
或者我可以将查询转换为当前类型,首先将其作为一般对象,然后将其更改回原始类型,如下所示
static TValue GetValueBasedOnType<TValue>(int configKey)
{
var query = dbcontext.Configurations.Where(c => c.configKey == configKey);
if (typeof(TValue) == typeof(bool))
return (TValue)(object)(query.Select(c => c.ValueBit).FirstOrDefault() ?? false);
if (typeof(TValue) == typeof(string))
return (TValue)(object)(query.Select(c => c.ValueText).FirstOrDefault());
if (typeof(TValue) == typeof(decimal))
return (TValue)(object)(query.Select(c => c.ValueDecimal).FirstOrDefault());
return default(TValue);
}
我只是想知道哪个选项更好用?
答案 0 :(得分:1)
您可以使用Linq Cast
功能将直接投射到TValue
:
static TValue GetValueBasedOnType<TValue>(int configKey)
{
var query = new List<Configuration>{ new Configuration { ValueDecimal = 1.2M, ValueBit = true, ValueText = "Text" }};
if (typeof(TValue) == typeof(bool))
return query.Select(c => c.ValueBit).Cast<TValue>().FirstOrDefault();
if (typeof(TValue) == typeof(string))
return query.Select(c => c.ValueText).Cast<TValue>().FirstOrDefault();
if (typeof(TValue) == typeof(decimal))
return query.Select(c => c.ValueDecimal).Cast<TValue>().FirstOrDefault();
return default(TValue);
}
如您所见,我使用List<Configuration>
来测试您的功能。使用LinqPad中的以下附加代码:
public class Configuration
{
public bool ValueBit { get; set; }
public string ValueText { get; set; }
public decimal ValueDecimal { get; set; }
}
void Main()
{
GetValueBasedOnType<bool>(0).Dump();
GetValueBasedOnType<string>(0).Dump();
GetValueBasedOnType<decimal>(0).Dump();
}
我的输出正如所料:
真 文本 1.2
出于兴趣,我在Linqpad中针对我自己的数据库运行了类似的查询,并且我再次获得了预期的结果,并且生成的SQL令人满意 - TOP(1)
查询。