【问题标题】:Queryable with generic Type <T> Handling Null or 0 Values可使用通用类型 <T> 处理空值或 0 值进行查询
【发布时间】:2016-07-01 13:58:23
【问题描述】:

{“转换为值类型'System.Int32'失败,因为具体化值为null。结果类型的泛型参数或查询必须使用可为空的类型。”}

我正在尝试处理具有通用类型T 的可查询列表中的null 值。我试过 DefaultIfEmpty(0) 不起作用,因为无法将 Type T 转换为 int。如何处理nulls 或ints 到列表?

public  IEnumerable<T> SelectAll<T>(Object TableName)where T:class
{
    String TableNameString = Type.GetType(TableName.ToString()).Name;
            QueryString = "SELECT" + " " + "*" + " " + "FROM" + " " + TableNameString;
    if (Database.Connection.State == ConnectionState.Closed)
        Database.Connection.Open();

    var a = ((IObjectContextAdapter)this).ObjectContext;
    var t = a.ExecuteStoreQuery<T>(QueryString).AsQueryable().DefaultIfEmpty().ToList();
    List<T> newList = t;
    return newList;
}

【问题讨论】:

  • 你是怎么调用这个方法的?在您的具体情况下,T 的价值是多少?是int吗?
  • 数据库中的列是否可以为空?
  • 数据库中有一些空列@YacoubMassad
  • 我在一个类中调用这个方法,它将类的类型转换为 T 并返回一个 Listof @YacoubMassad
  • 如果数据库表允许表中有空值,您需要在代码中适当地处理它。您可以在 QueryString 中使用一些 SQL 来执行此操作。 SELECT (prop1, prop2, prop3, ISNULL(prop4, 0), ISNULL(prop5, 'NULL') FROM table_name;其中 prop4 是整数类型,prop5 是 varchar 类型。此外,您可以将当前查询放在单个字符串中,QueryString = "SELECT * FROM " + TableNameString;

标签: c# entity-framework linq generics


【解决方案1】:

(It) 不起作用,因为无法将 Type T 转换为 int

听起来您需要传入int? 类型,但由于泛型参数约束,编译器不允许这样做。你能从你的方法中移除这个约束吗?

where T : class

我不相信DefaultIfEmpty(0) 会按照你的想法去做。一方面,它在映射到T 类型失败后才会生效。其次,它不会用0 替换null 元素。它将一个空的结果集替换为一个结果集,该结果集恰好具有一个值为 0 的项目。

以下是可为空映射的示例以及 DefaultIfEmpty 的工作原理。

private void MappingExample()
{
    var complex = GetQuery<ComplexObject>("select Id, null as OptionalAlias from customer").ToArray();
    var simple = GetQuery<int?>("select null as OptionalAlias from customer").ToArray();
}

private void DefaultIfEmptyExample()
{
    var nulls = new int?[] { null, null };
    var nullsWithDefault = simple.DefaultIfEmpty(0); //still full of nulls

    var empty = new int?[] { };
    var emptyWithDefault = empty.DefaultIfEmpty(0); //has one item valued 0
}

private class ComplexObject
{
    public int Id { get; set; }
    public int? OptionalAlias { get; set; }
}

private IEnumerable<T> GetQuery<T>(string sql)
{
    var context = ContextManager.GetNew(); //proprietary, replace with your own
    var parms = new System.Data.SqlClient.SqlParameter[] { };
    return context.Database.SqlQuery<T>(sql, parms);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2017-09-25
    • 2012-12-30
    • 1970-01-01
    • 2018-04-22
    相关资源
    最近更新 更多