我是.net和C#的新手,这对我来说似乎是一个基本问题,但是没有多少搜索或调试解决了这个问题。
我在存储库类中有这个代码:
// Attempt #1
var results = from d in db.Documents
join f in db.DocumentFrames on d.Id equals f.DocumentId
select d;
return results.ToList();
// Attempt #2
var options = new DataLoadOptions();
options.LoadWith<Document>(d => d.DocumentFrames);
db.LoadOptions = options;
var results = db.Documents.ToList();
代码返回我期望的内容(List<Document>
)。我的控制器然后执行此操作:
List<APIDocument> transformed = new List<APIDocument>();
foreach(Document document in documents)
{
transformed.Add(this.PrepareModelForResponse(document));
}
return transformed;
PrepareModelForResponse
的代码:
private APIDocument PrepareModelForResponse(Document document)
{
APIDocument response = new APIDocument();
response.setPropertiesFromObject(document);
return response;
}
我准备每个文档输出(此代码是API的一部分),并且在执行此操作时发生错误:
public void setPropertiesFromObject(Document document)
{
this.Id = document.Id;
this.OriginalFileUrl = document.OriginalFileUrl;
this.CreatedAt = document.CreatedAt;
foreach (DocumentFrame frame in document.DocumentFrames)
{
APIDocumentFrame newFrame = new APIDocumentFrame();
newFrame.setPropertiesFromObject(frame);
this.DocumentFrames.Add(newFrame);
}
}
我得到InvalidCastException
&#34;指定演员表无效&#34;在foreach语句中,这是堆栈跟踪:
at System.Data.SqlClient.SqlBuffer.get_Byte()
at System.Data.SqlClient.SqlDataReader.GetByte(Int32 i)
at Read_DocumentFrame(ObjectMaterializer`1 )
at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
at System.Data.Linq.EntitySet`1.Load()
at System.Data.Linq.EntitySet`1.GetEnumerator()
at InDesignAPI.Models.API.APIDocument.setPropertiesFromObject(Document document) in c:\FakeProjectPath\Models\API\APIDocument.cs:line 23
at InDesignAPI.Controllers.DocumentsController.PrepareModelForResponse(Document document) in c:\FakeProjectPath\Controllers\DocumentsController.cs:line 144
at InDesignAPI.Controllers.DocumentsController.GetDocument(Int32 id) in c:\FakeProjectPath\Controllers\DocumentsController.cs:line 42
at lambda_method(Closure , Object , Object[] )
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
我是否可以通过列表中的文档自动包含DocumentFrames的方式改变查询?
在调试此问题时,如果我在调试窗格中单击结果视图,document.DocumentFrames会显示DocumentFrames对象,这表明数据已正确加载,所以我不确定我在这里缺少什么
答案 0 :(得分:0)
此处不需要显式连接和查询,因为EntityFramework已知道如何与DocumentFrames连接。
var options = new DataLoadOptions();
options.LoadWith<Document>(d => d.DocumentFrames);
db.LoadOptions = options;
var results = db.Documents.ToList();
答案 1 :(得分:0)
如果您使用的是Entity Framework,则可以使用“关系”和“导航属性”访问document.DocumentFrames。请检查此link
答案 2 :(得分:0)
因此,经过大量的讨论,我通过删除dbml文件中的所有内容并重新拖动所有表来重新创建我的部分类。
我生成的类文件和数据库之间存在不一致,因此解析DocumentFrame对象无论发生什么上下文都会返回错误。