5

これが私のクラスです:

public class Person
{
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public string FullName { get { return FirstName + " " + LastName; } }
}

これが私のリストです:

var persons = new List<Person>();
persons.Add(...);
persons.Add(...);
etc.

次のように「計算された」プロパティFullNameを介してリストを検索しようとすると、次のようになります。

return persons.Where(p => p.FullName.Contains("blah")) 

次のエラーが発生します。

System.NotSupportedException:指定されたタイプメンバー'FullName'は、LINQtoEntitiesではサポートされていません。初期化子、エンティティメンバー、およびエンティティナビゲーションプロパティのみがサポートされます。

どうすればこれを回避できますか?

4

3 に答える 3

2

IQueriable述語で計算されたプロパティを使用することはできません。これを実現するには2つの方法があります。

データベースにビューを作成し、そこに計算されたFullName列を作成して、この列をデータエンティティにマップし直すことができます。

次に、すべてのデータをクライアントに取得して、メモリ内でフィルタリングできます。

persons
  .ToList() // Execute this query and get results
  .Where(p => p.FullName.Contains("blah");
于 2012-11-30T20:02:58.753 に答える
1

Whereあなたの場合、あなたはあなたの計算されたプロパティの両方の部分を使うようにあなたを単に変えることができます:

return persons.Where(p => (p.FirstName + " " + p.LastName).Contains("blah")) 
于 2012-11-30T20:01:19.467 に答える
0

私が作成したこのnugetパッケージを試してください: https ://www.nuget.org/packages/NinjaNye.SearchExtensions/

インストールすると、次のことができるようになります

people.Search("blah", p => p.FirstName, p => p.LastName);

上記は、FirstNameORのいずれかに「blah」が存在するレコードを返しますLastName。これはすべてを使用して行われるExpression Treesため、検索はメモリではなくSQLで行われます。

他の使用例については、プロジェクトページを確認してください: https ://github.com/ninjanye/SearchExtensions

于 2014-01-21T17:18:33.223 に答える