Ich habe ein Problem mit der Auswahl einer Zeichenfolge Sammlung und habe es reproduziert mit dem folgenden kleinen Beispiel.NHibernate Abfrage auf eine Zeichenfolge Sammlung mit Linq führt entweder Fehler oder leere Sammlung
die folgende SQL Gegeben:
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')
Und der Code (I verwendet 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");
}
}
Die ersten assert Pässe und dies, in meinem Kopf, bestätigt meine Zuordnung der Kategorien auf die Post.
Die Abfrage im try-Block löst eine Ausnahme
'System.Linq.EnumerableQuery`1[System.Collections.Generic.IList`1[System.String]]' cannot be converted to type 'System.Linq.IQueryable`1[System.Object[]]
So habe ich es in den 3. Versuch geändert Sie den Code zu sehen, rufen .ToList().First()
. Diese Abfrage löst keine Ausnahme aus, aber die Kategorienliste wird leer zurückgegeben.
Mache ich etwas falsch? Gibt es hier eine bessere Kartierungstechnik? Oder gibt es Workarounds, um meine Anfrage zu bearbeiten?
ich eine neue Kategorie Klasse erstellen als mit einer Liste von Strings passt meine Domain besser wirklich vermeiden wollte. Ich habe das auch mit QueryOver versucht und bekomme den gleichen Fehler. – Matt