Tôi gặp vấn đề với việc chọn một bộ sưu tập chuỗi và đã sao chép nó bằng ví dụ nhỏ sau đây.NHibernate truy vấn trên một bộ sưu tập chuỗi bằng cách sử dụng kết quả LINQ hoặc lỗi hoặc bộ sưu tập trống
Với SQL sau:
CREATE TABLE [Post] (
[Id] INT IDENTITY NOT NULL,
[Name] NVARCHAR(20) NOT NULL,
CONSTRAINT [PK_Post] PRIMARY KEY CLUSTERED ([Id])
)
CREATE TABLE [Category] (
[Id] INT IDENTITY NOT NULL,
[PostId] INT NOT NULL,
[Name] NVARCHAR(20) NOT NULL,
CONSTRAINT [FK_Category_Post] FOREIGN KEY ([PostId]) REFERENCES [Post]([Id])
)
INSERT INTO [Post] ([Name]) VALUES ('Post 1')
INSERT INTO [Category] ([PostId], [Name]) VALUES (1, 'Alpha')
Và mã (tôi đã sử dụng LINQPad):
void Main()
{
using (var sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.Dialect<MsSql2012Dialect>().ConnectionString(@"Data Source=(localdb)\Projects;Initial Catalog=NhTest;"))
.Mappings(x => {
x.FluentMappings.Add(typeof(PostMap));
})
.BuildSessionFactory())
using (var session = sessionFactory.OpenSession())
{
var post = session.Get<Post>(1);
Debug.Assert(post.Categories.First() == "Alpha");
try {
var second = session.Query<Post>()
.Where(x => x.Id == 1)
.Select(x => new {
x.Categories,
x.Name,
})
.Single();
}
catch (Exception ex) {
Debug.Fail(ex.ToString());
}
var third = session.Query<Post>()
.Where(x => x.Id == 1)
.Select(x => new {
x.Categories,
x.Name,
})
.ToList().First();
Debug.Assert(third.Categories.Count() == 1, "Category count was " + third.Categories.Count());
}
}
// Define other methods and classes here
class Post
{
public virtual int Id { get; protected set; }
public virtual string Name { get; protected set; }
public virtual IList<string> Categories { get; protected set; }
}
class PostMap : ClassMap<Post>
{
public PostMap()
{
Id(x => x.Id);
Map(x => x.Name);
HasMany(x => x.Categories)
.Table("Category")
.Element("Name")
.KeyColumn("PostId");
}
}
Các đèo khẳng định đầu tiên và điều này, trong tâm trí của tôi, xác nhận bản đồ của tôi về loại vào bài.
Các truy vấn trong khối try ném một ngoại lệ
'System.Linq.EnumerableQuery`1[System.Collections.Generic.IList`1[System.String]]' cannot be converted to type 'System.Linq.IQueryable`1[System.Object[]]
Vì vậy, tôi đã thay đổi nó vào nỗ lực thứ 3 mà bạn nhìn thấy trong các mã, gọi .ToList().First()
. Truy vấn này không ném bất kỳ ngoại lệ nào nhưng danh sách danh mục được trả lại trống.
Tôi có làm gì sai không? Có kỹ thuật lập bản đồ tốt hơn để sử dụng ở đây không? Hoặc có cách giải quyết nào để truy vấn của tôi hoạt động không?
Tôi thực sự muốn tránh tạo ra một lớp Category mới như có một danh sách các chuỗi phù hợp với tên miền của tôi tốt hơn. Tôi cũng đã thử điều này với QueryOver và nhận được cùng một lỗi. – Matt