带有null对象的Linq-to-Sql表达式抛出NPE

时间:2017-09-08 03:33:33

标签: c# linq-to-sql linq-expressions

以下linq-to-sql表达式抛出空指针异常。

$(function () {
$('#container').highcharts('StockChart', {
    xAxis: {
        events: {
            afterSetExtremes: function (e) {
            }
        }
    },
    rangeSelector: {
        selected: 1
    },
    series: [{
        name: 'USD to EUR',
        data: usdeur
    }]
  });
});

我发现问题是List<string> nameList = GetNames(); db.Users.FindSync(u => nameList.Contains(u.Name)) 为空。但是以下更新并没有帮助。

nameList

我从谷歌搜索中发现NPE在转换为SQL期间发生(而不是在评估期间)。有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:3)

考虑.FindSync(u => ......)内部在另一个上下文/领域/维度中发生的事情 和Only entity types, enumeration types or primitive types are supported in this context.

您可能会认为&#34;但为什么nameList.Contains正在工作&#34;这是因为库确实支持将其转换为SQL。遗憾的是,不支持nameList本身,也不支持nameList == null。

您的解决方案应该在linq之前/之前进行空检查 也许像是

var uResult = nameList == null ? db.Users.GetAll() : db.Users.FindSync(u => nameList.Contains(u.Name))

答案 1 :(得分:1)

看来你在这里几乎没有选择。这是我通常用来解决这些问题的方法。

var list = new string[] { "One", "Two", "Three" };
var list2 = new string[] { "One", "Five" };
var db = new string[] { "One", "Two", "Four" };

var conditions = new List<Func<String, bool>>();
if (list != null)
{
    conditions.Add(s => list.Contains(s));
}

if (list2 != null)
{
    conditions.Add(s => list2.Contains(s));
}

var query = db.AsEnumerable(); // AsQuerable on your side.
foreach (var condition in conditions)
{
    query = query.Where(condition);
}

var result = query.ToList(); // Outputs "One".