1

Dynamic Linq ライブラリを使用して動的検索式を作成しています。1 対多の関係を持つナビゲーション プロパティのダイナミック linq ライブラリを使用して、ラムバ式を構築する方法で問題が発生しました。

次のものを含むステートメントで使用しています-

 Person.Names.Select(FamilyName).FirstOrDefault()

動作しますが、問題が 2 つあります。

  1. もちろん、FirstOrDefault() 名のみを選択します。各人のすべての名前を使用したいと考えています。

  2. 個人の名前がない場合、Select は例外をスローします。

通常のクエリでは from ステートメントを 2 つ実行できるためそれほど難しくありませんが、ラムダ式はより困難です。

任意の推奨事項をいただければ幸いです。

EDIT-追加のコード情報...非動的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;}
}
4

1 に答える 1

2

私たちはそれをハッシュして作りましたが、それは非常に困難でした. 以下は、最終結果に至るまでのさまざまな方法です。ここで、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 メソッドを追加する必要があります。

編集 - または、選択だけを使用します...はるかに単純です...ただし、上記のContainsメソッドの追加が必要です。

var results = persons.AsQueryable().Where("Names.Select(FamilyName)
                                   .Contains(@0", "Smith)

最初にこれを試しましたが、「該当する集約メソッドが含まれていません」という恐ろしい結果に遭遇しました。エラー。SelectMany を機能させようとしたときに問題を解決した方法を一巡したので、Select メソッドに戻りました。

于 2011-03-03T21:43:05.113 に答える