Entity Framework(EF)を使用して、動的linqを使用してデータベースから人々のサブセットを取得しようとしています。 contains操作を使用すると問題が発生します。 Peopleテーブルのエンティティは次のとおりです。
public class Person
{
public string Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
public string ZipCode { get; set; }
}
これは正常に機能するクエリです。
var people = personContext
.People
.OrderBy("id asc")
.Skip(0)
.Take(5)
.ToList();
OrderByメソッドで動的linqを使用していることに注意してください。しかし、フィルタリングを適用しようとすると、例外が発生します。
var people = personContext
.People
.Where("id.Contains(15)")
.OrderBy("id asc")
.Skip(0)
.Take(5)
.ToList();
私が取得したいのは、次のように、サブストリング「15」を含むIDを持つ人々のサブセットです。
"015", "115", "151", "152", etc.
コードを実行すると、次のエラーが発生します。
System.Linq.Dynamic.ParseException was unhandled by user code
Message=No applicable method 'Contains' exists in type 'String'
Idフィールドに文字列「15」が含まれているかどうかを判断するための構文は何ですか?
私はここで誤解を感じています...あなたはこのようなLINQを使うべきではありません。まず、ラムダを受け入れるオーバーロードを呼び出す必要があります。次に、ラムダでプロパティを指定し、それが文字列の場合、 Contains
を呼び出しContains
。そのようです:
var people = personContext
.People
.Where(p => p.Id.Contains("15"))
.OrderByDescending(p => p.Id)
.Skip(0) // You don't need this line.
.Take(5)
.ToList();
EF自体が面倒な作業を行い、これらの純粋なC#コードを正しいSQLステートメントに変換します。