我正在尝试编写用于在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.
我不知道接下来该做什么。也许还有另一个解决这个问题的方法。