2

エンティティにC#とLINQを使用すると、子エンティティと親エンティティの検索に問題があります。概念的には、これらの子が特定のプロパティを持ち、これらの子の親も特定のプロパティを持っているIEnumerable子のコレクションを取得しようとしています。

具体的には、多対多の関係にあるルートとストリートがあります。ストリートがLeftNoteまたはRightNoteの正のプロパティを持つ特定のルート上のストリートを検索しようとしています(LeftNoteとRightNoteは文字列であり、空のスペースではない文字列を検索しています)。

私は次のエンティティを持っています(明確にするために切り詰めました)

public class Route
{
    public int RouteID { get; set; }

    public virtual ICollection<Street> Streets { get; set; }
}

public class Street
{
    public string LeftNote { get; set; }

    public string RightNote { get; set; }

    public virtual ICollection<Route> Routes { get; set; }
}

次のLINQ式があります。

var streets = this.repository.Routes
                        .Where(r => r.RouteID == routeId).FirstOrDefault()
                        .Streets
                        .Where(s => s.LeftNote.Length > 0 || s.RightNote.Length > 0);

これは、ルートが存在するが、LeftNotesまたはRightNotesがある通りがないエンティティデータに対してこれを実行するまでは完全に機能します。このような場合、NullReference例外が発生します。私は、LeftNotesでStreetsの不在を処理するこのクエリを適切に表現する方法を見つけようとしています(routeIdに一致するRouteが常に存在する必要があります。そうでない場合は、有効な例外ケースであり、スローしてエラーになります)。

編集:問題は、LINQ構造に関連するものではなく、null文字列に関連しているようです。

4

6 に答える 6

1

String.IsNullOrEmpty()を使用するだけです。

var streets = this.repository
                .Routes
                .Where(r => r.RouteID == routeId).FirstOrDefault()
                .Streets
                .Where(s => !String.IsNullOrEmpty(s.LeftNote) ||
                            !String.IsNullOrEmpty(s.RightNote));
于 2012-04-27T11:25:29.413 に答える
1
var streets = this.repository
                  .Routes
                  .Where(r => r.RouteID == routeId).FirstOrDefault()
                  .Streets
                  .Where(s => s.LeftNote !=null ? s.LeftNote.Length > 0 : false
                          || s.RightNote !=null ? s.RightNote.Length > 0 : false);

Havnはそれをテストしていませんが、動作するはずだと思います。

また

this.repository.Streets(s=>(s.LeftNote.Length >0 || s.RightNote.Length > 0 ) 
                             && s.Routes.routeId==routeId));
于 2012-04-27T11:12:47.477 に答える
1

本当のことですか

var streets = repository.Streets.Where
       (s => s.Routes.Any(r => r.RouteID == routeId )
             && (s.LeftNote.Length > 0 || s.RightNote.Length > 0));
于 2012-04-27T11:06:48.273 に答える
0

1つのクエリで実行する必要がありますか

IEnumerable<Street> streets = Enumerable.Empty<Street>();
var route = this.repository
                .Routes
                .Where(r => r.RouteID == routeId).FirstOrDefault()

if(route != null && route.Streets.Any())
{
    streets = route.Streets
                   .Where(s => s.LeftNote.Length > 0 
                            || s.RightNote.Length > 0);
}
于 2012-04-27T11:18:08.373 に答える
0

次のことを試してください。

var streets = this.repository.Routes
                             .Where(r => r.RouteID == routeId).FirstOrDefault()
                             .Streets
                             .Where(s => s.LeftNote ? s.LeftNote.Length > 0 : false || s.RightNote ? s.RightNote.Length > 0 : true);

アップデート

var streets = this.repository.Streets
                             .Where(s => s.Routes.RouteID == routeId && s.LeftNote.Length > 0 || s.RightNote.Length > 0);

更新コードは、新しいコードを挿入した後です。

最初に false を使用する理由は、2 番目または句の検証を強制するためです。以下が機能するかどうかはわかりません。

于 2012-04-27T10:57:10.933 に答える
0

LINQ式をこれに変更してみてください

var streets = this.repository.Routes
                  .Where(r => r.RouteID == routeId).FirstOrDefault()
                  .Where(r => r.Streets.Any(s => s.LeftNote.Length > 0 || s.RightNote.Length > 0));
于 2012-04-27T11:29:05.750 に答える