Dynamic Linqライブラリを使用して動的検索式を構築しています。 1対多の関係を持つナビゲーションプロパティの動的linqライブラリを使用して、ランバ式を構築する方法に関する問題に遭遇しました。
containsステートメントで使用している次のものがあります-
Person.Names.Select(FamilyName).FirstOrDefault()
動作しますが、2つの問題があります。
もちろん、FirstOrDefault()名のみを選択します。各人の名前をすべて使用する必要があります。
人の名前がない場合、Selectは例外をスローします。
2つのfromステートメントを実行できるため、通常のクエリではそれほど難しくありませんが、ラムダ式のほうが難しいです。
任意の推奨事項をいただければ幸いです。
編集-追加のコード情報...非動的linq式は次のようになります。
var results = persons.Where(p => p.Names.Select(n => n.FamilyName).FirstOrDefault().Contains("Smith")).ToList();
クラスは次のようになります-
public class Person
{
public bool IsActive { get; set;}
public virtual ICollection<Name> Names {get; set;}
}
public class Name
{
public string GivenName { get; set; }
public string FamilyName { get; set; }
public virtual Person Person { get; set;}
}
ハッシュ化して作成しましたが、かなりやりがいがありました。以下は、最終的な結果に至るまでのさまざまな方法です。ここで、SearchExpressionクラスがどのように構築されるかを再考する必要がありますが、それは別の話です。
1.同等のクエリ構文
var results = from person in persons
from name in person.names
where name.FamilyName.Contains("Smith")
select person;
2.同等のラムダ構文
var results = persons.SelectMany(person => person.Names)
.Where(name => name.FamilyName.Contains("Smith"))
.Select(personName => personName.Person);
3. Dynamic Linqでの同等のLambda構文
var results = persons.AsQueryable().SelectMany("Names")
.Where("FamilyName.Contains(@0)", "Smith")
.Select("Person");
注 -動的LinqライブラリにContainsメソッドを追加する必要があります。
編集-別の方法として、selectを使用します...はるかに単純ですが、上記のようにContainsメソッドを追加する必要があります。
var results = persons.AsQueryable().Where("Names.Select(FamilyName)
.Contains(@0", "Smith)
私たちは最初にこれを試しましたが、恐ろしい「該当する集約メソッドが含まれていませんContains」に遭遇しました。エラー。私はSelectManyを機能させようとするときに問題を解決する方法を回っていました...そのため、Selectメソッドに戻りました。