枚举Linq.EntitySet

时间:2014-09-29 06:23:45

标签: c# .net linq

我是.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对象,这表明数据已正确加载,所以我不确定我在这里缺少什么

3 个答案:

答案 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对象无论发生什么上下文都会返回错误。