gpt4 book ai didi

c# - 根据通用类型参数查询不同的列

转载 作者:行者123 更新时间:2023-11-30 17:35:19 24 4
gpt4 key购买 nike

我有一个包含配置的表,并且有多种类型(存储在不同的列中),我需要根据通用类型使用 Entity Framework 查询当前类型

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

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

最佳答案

您可以直接转换为TValue使用 Linq Cast 功能:

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

我的输出如预期的那样:

True Text 1.2

出于兴趣,我在 Linqpad 中针对我自己的数据库 运行了一个类似的查询,我再次得到了预期的结果,并且生成的 SQL 令人满意 - TOP(1)查询。

关于c# - 根据通用类型参数查询不同的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41275960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com