根据泛型类型参数查询不同的列

时间:2016-12-22 04:48:28

标签: c# sql-server entity-framework linq dbcontext

我有一个包含配置的表,有多种类型(存储在不同的列中),我需要根据泛型类型使用实体框架查询当前类型

我有两种方法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);
    }

我只是想知道哪个选项更好用?

1 个答案:

答案 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)查询。

相关问题