DataContext.ExecuteQuery <object>返回object {} </object>

时间:2015-03-21 19:23:15

标签: sql sql-server linq

我正在尝试编写用于在linq中选择可选列的函数(可能不存在的列)。问题出在这样的linq:

using (DataDataContext db = new DataDataContext()){
var collection = from t in table 
select new 
{
Nonoptional = t.A;
Optional = IsInDB("table","B") ? t.B : -1; //this is optional column
}}

不幸的是,这不起作用,因为Optional附近的片段将被转换为case语句,并且出现错误,该列不存在。

所以我决定用功能“覆盖”它:

using (DataDataContext db = new DataDataContext()){
var collection = from t in table 
select new 
{
Nonoptional = t.A;
Optional = IsInDB("table","B") ? OptionalColumnValue<int>("table","B","id_table",t.id_table) : -1; //this is optional column
}}

我希望这个功能是通用的。它应该像那样“如果没有值或列可以为空并且value为null,则返回type的默认值。 我想出了类似的东西:

//table,column - obvious,id_column - PK column of table, id - id of currently processing record      
public static T OptionalColumnValue<T>(string table,string column,string id_columm,int id) T t = default(T);

  DataDataContext db = new DataDataContext();

  IEnumerable<object> value = db.ExecuteQuery<object>("select " + column + " from " + table + " where " + id_columm + " = " + id.ToString());

  List<object> valueList = value.ToList();

   if (valueList.Count == 1)//here is the problem
    t = (T)valueList.First();

  return t;

}

当存在null值时,db.ExecuteQuery返回类似object {}的内容。我假设这是“空”对象,没有真正的东西。我正在考虑检查这个对象的“空虚”(顺便说一句,这不是DBull)。

当我意识到这在本专栏中没有具体的价值(它不能将其转换为返回正确的类型)时,我尝试了db.ExecuteQuery&lt; T&gt;。然后具体值 - 好,空 - 异常。

我想,也许Nullable&lt; T&gt;作为回报值。不,因为字符串也可以是T.

我不知道接下来该做什么。也许还有另一个解决这个问题的方法。

0 个答案:

没有答案