1

More a general question, but how can I write LINQ Lambda expressions such that they will return a default string or simply an empty string if the LINQ expression fails or returns nothing. In XSLT XPath if a match fails then one just got nothing, and the application did not crash whereas in LINQ one seems to get exceptions.

I use First() and have tried FirstOrDefault().

So example queries may be:

Customers.First(c=>c.id==CustId).Tasks.ToList();

or

Customers.Where(c=>c.id==CustId).ToList();

or

Model.myCustomers.Where(c=>c.id==CustId);

etc.

Whatever the query, if it returns no records or null, then is there a general approach to ensure the query fails gracefully?

Thanks.

4

3 回答 3

1

Customers.First(c=>c.id==CustId)如果没有匹配的记录会崩溃。

有几种方法可以尝试找到它,如果你使用它,如果没有找到匹配项FirstOrDefault就会返回NULL,你可以检查NULL.

或者,您可以使用.Any检查您是否有任何记录并返回的语法boolean

于 2013-06-24T22:09:26.970 回答
1

当您访问属性时,C# 中没有内置任何优雅的东西来传播空值。您可以创建自己的扩展方法:

public static class Extensions
{
    public static TValue SafeGet<TObject, TValue>(
        this TObject obj, 
        Func<TObject, TValue> propertyAccessor)
    {
        return obj == null ? default(TValue) : propertyAccessor(obj);
    }

    public static IEnumerable<T> OrEmpty<T>(this IEnumerable<T> collection)
    {
        return collection ?? Enumerable.Empty<T>();
    }
}

像这样使用:

Customers.FirstOrDefault(c => c.id==CustId).SafeGet(c => c.Tasks).OrEmpty().ToList();
于 2013-06-24T22:12:59.773 回答
0

我希望抛出异常的唯一查询是第一个查询(假设这Customers是一个有效的集合而不是 null 本身):

Customers.First(c=>c.id==CustId).Tasks.ToList();

id如果没有带有of 的客户,这将引发异常CustId(您的属性和变量名称存在一些大小写问题)。

如果您不希望在不匹配时引发异常,FirstOrDefault请按照您提到的方式使用,并进行空检查,例如:

var customer = Customers.FirstOrDefault(c => c.id == CustId);
if (customer == null)
{
    // deal with no match
    return;
}

var taskList = customer.Tasks.ToList();
于 2013-06-24T22:07:38.707 回答