2

よくわからないエラーが発生しました。私はグーグルを試みましたが成功しませんでした。このエラーが発生している場所に次のクエリを書きました。

エンティティまたは複合型 'MyWebProject.Models.UserDetail' は、LINQ to Entities クエリで構築できません。

クエリ:

UsersContext db = new UsersContext();
        var userdata = (from k in db.UserDetails
                        where k.UserId == WebSecurity.CurrentUserId
                        select new UserDetail()
                        {

                            FullName = k.FullName,
                            Email = k.Email,
                            About = k.About,
                            Link = k.Link,
                            UserSchool = new School()
                            {
                                SchoolId = k.UserSchool.SchoolId,
                                SchoolName = k.UserSchool.SchoolName
                            },
                            UserCourse = new Course()
                            {
                                CourseId=k.UserCourse.CourseId,
                                CourseName=k.UserCourse.CourseName
                            },
                            Country=k.Country
                        }).FirstOrDefault();

クラス:

public class UserDetail
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public string FullName { get; set; }
    public string Link { get; set; }
    public bool? Verified { get; set; }

    public string Email { get; set; }

    public string About { get; set; }
    public School UserSchool { get; set; }
    public Course UserCourse { get; set; }

    public string Country { get; set; }

}
public class School
{
    public int SchoolId { get; set; }
    public string SchoolName { get; set; }
    public string Country { get; set; }
}
public class Course
{

    public int CourseId { get; set; }
    public string CourseName { get; set; }
    public School School { get; set; }
}

何がうまくいかなかったのですか??

4

4 に答える 4

4

クエリの途中で複雑なプロパティ School と Course を作成する方法が原因のようです。ユーザーを選択し (選択変換を削除)、ナビゲーション プロパティを使用してこれらのオブジェクトにアクセスし、手動で構築するよりも優れています。外部キーで構築された適切な関係がある限り、ナビゲーションはこれを目的としています。

UsersContext db = new UsersContext();

var userdata = (from k in db.UserDetails
    where k.UserId == WebSecurity.CurrentUserId})
    .FirstOrDefault();

// access navigation properties which will perform the joins on your behalf
// this also provides for lazy loading which would make it more effecient. (it wont load the school object until you need to access it)

userdata.School
userdata.Course

ナビゲーション プロパティに関する MSDN の記事: http://msdn.microsoft.com/en-us/library/vstudio/bb738520(v=vs.100).aspx

于 2012-12-10T20:35:07.453 に答える
3

これにより、必要なものが得られるはずです。オブジェクトをクエリの一部として読み込みます (遅延読み込みに依存しません)。

UsersContext db = new UsersContext();
var userdata = db.UserDetails.Include(x => x.UserSchool)
                             .Include(x => x.UserCourse)
                             .Include(x => x.Country)
                             .Where(x => x.UserId == WebSecurity.CurrentUserId)
                             .FirstOrDefault();
于 2012-12-10T20:34:18.473 に答える
0

あなたのエンティティがあなたが作成しようとしているオブジェクトと同じ名前を持っているからだと思います。戻したいオブジェクトの名前を変更してみてください。エンティティと同じタイプを返したい場合は、.Include( "relationshipname")機能を使用して熱心にロードしてみてください。

于 2012-12-10T21:13:05.110 に答える
0

@Yakimych からの優れた回答を以下に示します。

マップされたエンティティに投影することはできません (また、できるはずもありません)。ただし、匿名型または DTO に射影することはできます。

public class ProductDTO
{
    public string Name { get; set; }
    // Other field you may need from the Product entity
}

そして、あなたのメソッドは DTO のリストを返します。

public List<ProductDTO> GetProducts(int categoryID)
{
    return (from p in db.Products
            where p.CategoryID == categoryID
            select new ProductDTO { Name = p.Name }).ToList();
}

EF のマップされたエンティティは、基本的にデータベース テーブルを表します。マップされたエンティティに投影する場合、基本的に行うことはエンティティを部分的にロードすることであり、これは有効な状態ではありません。EF には、将来、そのようなエンティティの更新を処理する方法などの手がかりがありません (デフォルトの動作は、おそらく、読み込まれていないフィールドを null またはオブジェクトにあるもので上書きすることです)。DB 内のデータの一部が失われる危険性があるため、これは危険な操作です。したがって、EF でエンティティを部分的に読み込む (またはマップされたエンティティに投影する) ことはできません。

詳細については、次のリンクにアクセスしてください: The entity cannot be construct in a LINQ to Entities query

于 2012-12-11T02:16:27.933 に答える