Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据泛型类型参数查询不同的列_C#_Sql Server_Entity Framework_Linq_Dbcontext - Fatal编程技术网

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

C# 根据泛型类型参数查询不同的列,c#,sql-server,entity-framework,linq,dbcontext,C#,Sql Server,Entity Framework,Linq,Dbcontext,我有一个带有配置的表,有多种类型(存储在不同的列中),我需要使用entity framework根据泛型类型查询当前类型 我有两种方法1只是将所有内容转换为(动态),基本上说我不需要在这里进行类型检查 看起来像这样 static TValue GetValueBasedOnType<TValue>(int configKey) { var query = dbcontext.Configurations.Where(c => c.configKey

我有一个带有配置的表,有多种类型(存储在不同的列中),我需要使用entity framework根据泛型类型查询当前类型

我有两种方法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 GetValueBasedOnType(int-configKey)
{
var query=dbcontext.Configurations.Where(c=>c.configKey==configKey);
如果(类型化(TValue)=类型化(bool))
返回(动态)(query.Select(c=>c.ValueBit).FirstOrDefault()??false);
if(typeof(TValue)=typeof(string))
return(动态)(query.Select(c=>c.ValueText.FirstOrDefault());
if(typeof(TValue)=typeof(十进制))
return(动态)(query.Select(c=>c.ValueDecimal.FirstOrDefault());
返回默认值(TValue);
}
或者我可以将查询转换为当前类型,首先将其设置为常规对象,然后将其更改回原始类型,如下所示

   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 GetValueBasedOnType(int-configKey)
{
var query=dbcontext.Configurations.Where(c=>c.configKey==configKey);
如果(类型化(TValue)=类型化(bool))
返回(TValue)(对象)(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(十进制))
return(TValue)(object)(query.Select(c=>c.ValueDecimal.FirstOrDefault());
返回默认值(TValue);
}

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

您可以使用Linq函数直接将转换为
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);
}
静态TValue GetValueBasedOnType(int-configKey)
{
var query=new List{new Configuration{ValueDecimal=1.2M,ValueBit=true,ValueText=“Text”};
如果(类型化(TValue)=类型化(bool))
返回query.Select(c=>c.ValueBit.Cast().FirstOrDefault();
if(typeof(TValue)=typeof(string))
返回query.Select(c=>c.ValueText.Cast().FirstOrDefault();
if(typeof(TValue)=typeof(十进制))
返回query.Select(c=>c.ValueDecimal.Cast().FirstOrDefault();
返回默认值(TValue);
}
如您所见,我使用了一个
列表来测试您的函数。使用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();
}
公共类配置
{
公共布尔值位{get;set;}
公共字符串ValueText{get;set;}
公共十进制值decimal{get;set;}
}
void Main()
{
GetValueBasedOnType(0.Dump();
GetValueBasedOnType(0.Dump();
GetValueBasedOnType(0.Dump();
}
正如预期的那样,我的输出是:

真的 正文 1.2


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

我猜,如果您需要一个未知(动态)对象作为返回值,最好使用简单的
对象
并将
动态
保留为本机代码、COM互操作。为什么不直接强制转换为
TValue
?我不能直接强制转换尝试-它不会编译