2017-12-28 80 views
0

エンティティPersonがEFによって生成されています。私は、あなたが特定の文字を検索するときに、Facebookの検索のように、オートコンプリートのテキストボックスにファーストネームを表示しようとしています。私が実行しようとするとき、私は、エラー・メッセージが表示されます:LINQ to Entitiesクエリでエンティティを構築できません

The entity or complex type 'Dejtingsajt3.Repositories.Person' cannot be constructed in a LINQ to Entities query. 

これは.htmlのページから私のスクリプトコードです:

<script> 
    $("#searchInput").autocomplete({ 
     source: function (request, response) { 
      $.ajax({ 
       url: '@Url.Action("GetSearchValue", "Home")', 
       dataType: "json", 
       data: { search: $("#searchInput").val() }, 
       success: function (data) { 
        response($.map(data, function (item) { 
         return { label: item.FirstName, value: item.FirstName }; 
        })); 
       }, 
       error: function (xhr, status, error) { 
        alert("Error"); 
       } 
      }); 
     } 
    }); 
</script> 

これは、コントローラからの私の方法です:

public class HomeController : Controller 
{ 
    private DataContext dataContext = new DataContext(); 

    public ActionResult Index() 
    { 
     return View(); 
    } 

    public JsonResult GetSearchValue(string search) 
    { 
     List<Person> allSearch = dataContext.User.Where(n => n.FirstName 
     .Contains(search)).Select(x => new Person 
     { 
      FirstName = x.FirstName 

     }).ToList(); 

     return new JsonResult {Data=allSearch, JsonRequestBehavior = 
      JsonRequestBehavior.AllowGet }; 
    } 
} 

そして、これは私の人-エンティティです:

public class Person 
{ 
    public Person() 
    { 
     FriendRequestReceive = new HashSet<FriendRequest>(); 
     FriendRequestSend = new HashSet<FriendRequest>(); 
     MessageRecieve = new HashSet<Message>(); 
     MessageSend = new HashSet<Message>(); 
    } 

    [Key] 
    public int PersonID { get; set; } 

    [Required(ErrorMessage = "A first name is required.")] 
    [Display(Name = "First Name")] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage = "A last name is required.")] 
    public string LastName { get; set; } 

    [Required(ErrorMessage = "A social number is required.")] 
    public string SocialNumber { get; set; } 

    [Required(ErrorMessage = "A gender is required.")] 
    public string Gender { get; set; } 

    [Required(ErrorMessage = "A city is required.")] 
    public string City { get; set; } 

    [EmailAddress(ErrorMessage = "Please enter a valid email.")] 
    public string Mail { get; set; } 

    public string ProfilePicture { get; set; } 

    public string PresentationText { get; set; } 

    public string Preference { get; set; } 

    [Required(ErrorMessage = "A username is required.")] 
    public string UserName { get; set; } 

    [Compare("Password", ErrorMessage = "A password is required")] 
    [DataType(DataType.Password)] 
    public string Password { get; set; } 

    public virtual ICollection<FriendRequest> FriendRequestReceive { get; set; } 
    public virtual ICollection<FriendRequest> FriendRequestSend { get; set; } 
    public virtual ICollection<Message> MessageRecieve { get; set; } 
    public virtual ICollection<Message> MessageSend { get; set; } 
    public string FileName { get; internal set; } 
    public string ContentType { get; internal set; } 
    public byte[] File { get; internal set; } 
} 

私は解決策を探して、いくつかの異なるアプローチを試しましたが、幸運はありませんでした。

+0

あなたは、データベースからそれを取得する必要があり、EFクエリで 'Person'を作成することはできません。 'User'オブジェクトの型が' Person'であると仮定して、 'Select'を終了してください。 – NetMage

+0

@NetMage それは働いて、ありがとう! – user7388204

+0

答えに変換されました: – NetMage

答えて

0

問題は、コードの次の部分である:

List<Person> allSearch = dataContext 
    .User 
    .Where(n => n.FirstName.Contains(search)) 
    .Select(x => new Person { FirstName = x.FirstName }) 
    .ToList(); 

あなたは基本的に、部分的に有効な状態ではないエンティティをロードされないものを、マップされたエンティティ上にプロジェクトを作成しようとした場合。これは、マッピングされたエンティティにクエリを投影できない理由です。ただし、DTOを使用することもできます:

// DTO class for projection 
public class PersonDTO 
{ 
    public string FirstName { get; set; } 
} 

// correct query 
List<PersonDTO> allSearch = dataContext 
    .User 
    .Where(n => n.FirstName.Contains(search)) 
    .Select(x => new PersonDTO { FirstName = x.FirstName }) 
    .ToList(); 

他にも2つのオプションがあります。また

var allSearch = dataContext 
    .User 
    .Where(n => n.FirstName.Contains(search)) 
    .Select(x => new { FirstName = x.FirstName }) 
    .ToList(); 

、あなたがPersonクラスを使用することができます(あなたはすべての人のフィールドが必要な場合)が、あなたのクエリから投影を削除します:まず、あなたは匿名型にクエリをマップすることができ

List<Person> allSearch = dataContext 
    .User 
    .Where(n => n.FirstName.Contains(search)) 
    .ToList(); 
+0

こんにちは、 私はそれを試みましたが、私のリストがPersonであるためPersonDTOをPersonに変換できないと言われています。 : -/ – user7388204

+0

@ user7388204ローカル変数の型を 'List 'に変更するだけです。私は自分の答えを更新した –

0

することができます」 Personを作成する場合は、データベースから取得する必要があります。 Userのオブジェクト型と仮定するとPersonで、ちょうどSelectをオフのままに:

var allSearch = dataContext.User 
        .Where(n => n.FirstName.Contains(search)) 
        .ToList(); 
関連する問題