我有一个没有约束的数据库(给定,不可更改)。我的模型看起来像
public MyModel
{
public long Id { get; set; }
// Even if database column 'Value' could be NULL,
// the model - from business view - could not.
public long Value { get; set; }
}
我想阅读的数据是
Id Value
1 1
2 2
3 NULL
4 4
当我使用DBContext.MyModel.ToList()阅读时,它当然失败了。是否有可能在第3行捕获错误并返回3个有效错误?
我不依赖于EF,但我喜欢DB和Code之间的自动映射。
更新 看来我不够具体。我需要3行AS WELL作为错误的通知。
另外,我为demo创建了一个简单的案例。在现实生活中,我有大约800个表,最多250列。我不能通过模型修改来捕捉任何东西,例如日期超出范围,缺少关系和其他东西。
我真正需要的是每行的try..catch或行读取失败的事件,就像这样。
答案 0 :(得分:1)
好的,解决了。不是很优雅,但很实用。
var query = _DBContext
.Database
.SqlQuery<MyModel>("SELECT * FROM MyModel");
var result = new List<MyModel>();
var enumerator = query.GetEnumerator();
while (true)
{
try
{
var success = enumerator.MoveNext();
if (!success)
break;
var model = enumerator.Current;
result.Add(model);
}
catch (Exception ex)
{
}
}
return result;
答案 1 :(得分:0)
您需要使用nullable type
public MyModel
{
public long Id { get; set; }
// Even if database column 'Value' could be NULL,
// the model - from business view - could not.
public long? Value { get; set; }
}
此外,在您的选择查询中,您应该排除Value = null
var myModel = models.Where(x => x.Value != null);
希望它有所帮助。
答案 2 :(得分:0)
使用以下代码:
var list = from m in DBContext.MyModel
where (m != null)
select m;
然后只需将var list转换为您选择的List。
修改1
var myModel = models.Where(x => x.Value != null).ToList();
正如kienct89建议的那样也可行。
修改2
&#34;捕捉&#34;有多种选择。错误
如果你想抛出异常,请使用:
if(myList.Count() < DBContext.MyModel.Count()){
Exception myException = new Exception("Not all items ware correctly loaded");
throw myException;
}
或者使用有缺陷的数组创建一个单独的数组:
var faultyList = from m in DBContext.MyModel
where (m == null)
select m;
或者:
var faultyList= models.Where(x => x.Value == null).ToList();
答案 3 :(得分:0)
我不完全确定我理解您要做的事情,但如果您想要反映表中的内容,那么为什么不让您的模型与查询匹配?如果Value
可以是NULL
,那么请Value
为可空(即将其定义为long?
)。
这样,您可以简单地执行:
var records = DbContext.MyModel.ToList();
如果您想要过滤掉NULL
,可以执行以下操作:
records.Where(r => r.Value.HasValue)
如果您想要NULL
s的那些,您可以这样做:
records.Where(r => !r.Value.HasValue)
或者,如果您想知道任何行是否有NULL
,您可以这样做:
records.Any(r => !r.Value.HasValue)