1

もっと一般的な質問ですが、LINQ 式が失敗するか何も返さない場合にデフォルトの文字列または単に空の文字列を返すように LINQ Lambda 式を作成するにはどうすればよいですか。XSLT XPath では、一致が失敗した場合、何も得られず、アプリケーションはクラッシュしませんでしたが、LINQ では例外が発生したようです。

私は First() を使用し、FirstOrDefault() を試しました。

したがって、クエリの例は次のとおりです。

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

また

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

また

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

クエリが何であれ、レコードが返されないか null が返される場合、クエリが正常に失敗することを保証する一般的な方法はありますか?

ありがとう。

4

3 に答える 3

1

プロパティにアクセスするときに null を伝達するために 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 に答える
1

Customers.First(c=>c.id==CustId)一致するレコードがない場合、クラッシュします。

それを見つけようとする方法はいくつかあります。一致するものが見つからない場合はFirstOrDefaultそれが返され、 を確認できます。NULLNULL

または、.Anyレコードがあるかどうかをチェックして を返す構文を使用できますboolean

于 2013-06-24T22:09:26.970 に答える
0

例外をスローすると予想される唯一のクエリは、最初のクエリです (それCustomersが有効なコレクションであり、それ自体が null ではないことを前提としています)。

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

idofを持つ顧客がいない場合、これは例外をスローCustIdします (プロパティと変数名に大文字と小文字の問題があります)。

一致しない場合に例外をスローしたくない場合は、FirstOrDefault言及したとおりに使用し、null チェックを実行します。

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 に答える