2

完全なエラーは次のとおりです。

{
Message: "An error has occurred.",
ExceptionMessage: "The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.",
ExceptionType: "System.InvalidOperationException",
StackTrace: null,
InnerException: {
Message: "An error has occurred.",
ExceptionMessage: "Incorrect number of arguments for constructor",
ExceptionType: "System.ArgumentException",
StackTrace: " at System.Linq.Expressions.Expression.ValidateArgumentCount(MethodBase method, ExpressionType nodeKind, Int32 count, ParameterInfo[] pis) at System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodBase method, ExpressionType nodeKind, ReadOnlyCollection`1& arguments) at System.Linq.Expressions.Expression.New(ConstructorInfo constructor, IEnumerable`1 arguments) at System.Data.Objects.ELinq.InitializerMetadata.ProjectionNewMetadata.Emit(Translator translator, List`1 propertyTranslatorResults) at System.Data.Common.Internal.Materialization.Translator.HandleLinqRecord(RecordColumnMap columnMap, InitializerMetadata initializerMetadata) at System.Data.Common.Internal.Materialization.Translator.Visit(RecordColumnMap columnMap, TranslatorArg arg) at System.Data.Query.InternalTrees.RecordColumnMap.Accept[TResultType,TArgType](ColumnMapVisitorWithResults`2 visitor, TArgType arg) at System.Data.Common.Internal.Materialization.Translator.ProcessCollectionColumnMap(CollectionColumnMap columnMap, TranslatorArg arg, ColumnMap discriminatorColumnMap, Object discriminatorValue) at System.Data.Common.Internal.Materialization.Translator.Visit(SimpleCollectionColumnMap columnMap, TranslatorArg arg) at System.Data.Query.InternalTrees.SimpleCollectionColumnMap.Accept[TResultType,TArgType](ColumnMapVisitorWithResults`2 visitor, TArgType arg) at System.Data.Common.Internal.Materialization.Translator.TranslateColumnMap[TRequestedType](QueryCacheManager queryCacheManager, ColumnMap columnMap, MetadataWorkspace workspace, SpanIndex spanIndex, MergeOption mergeOption, Boolean valueLayer) at System.Data.Common.Internal.Materialization.ShaperFactory.TypedShaperFactoryCreator`1.TypedCreate(QueryCacheManager cacheManager, ColumnMap columnMap, MetadataWorkspace metadata, SpanIndex spanInfo, MergeOption mergeOption, Boolean valueLayer) at System.Data.Common.Internal.Materialization.ShaperFactory.Create(Type elementType, QueryCacheManager cacheManager, ColumnMap columnMap, MetadataWorkspace metadata, SpanIndex spanInfo, MergeOption mergeOption, Boolean valueLayer) at System.Data.Objects.Internal.ObjectQueryExecutionPlan.Prepare(ObjectContext context, DbQueryCommandTree tree, Type elementType, MergeOption mergeOption, Span span, ReadOnlyCollection`1 compiledQueryParameters, AliasGenerator aliasGenerator) at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption) at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) at Newtonsoft.Json.Serialization.JsonArrayContract.CreateWrapper(Object list) in c:\Dev\Releases\Working\Newtonsoft.Json\Src\Newtonsoft.Json\Serialization\JsonArrayContract.cs:line 108 at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) in c:\Dev\Releases\Working\Newtonsoft.Json\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalWriter.cs:line 128 at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) in c:\Dev\Releases\Working\Newtonsoft.Json\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalWriter.cs:line 342 at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) in c:\Dev\Releases\Working\Newtonsoft.Json\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalWriter.cs:line 123 at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value) in c:\Dev\Releases\Working\Newtonsoft.Json\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalWriter.cs:line 58 at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value) in c:\Dev\Releases\Working\Newtonsoft.Json\Src\Newtonsoft.Json\JsonSerializer.cs:line 608 at System.Net.Http.Formatting.JsonMediaTypeFormatter.<>c__DisplayClassd.<WriteToStreamAsync>b__c() at System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token)"
}
}

サーバーと他の同僚が同じコードを正常に実行できるため、これは私のコンピューターに分離されているようです。

私が持っていた唯一のリードは、Visual Studio 2012Expressを実行しているVS2010と並べてインストールしたことです。ただし、どちらも同じエラーが発生します。

さらに厄介なのは、json.netライブラリがローカルで参照されており、変更されていないことです。

Web APIコントローラーの1つだけがエラーをスローします(連絡先は、これまでにさまざまな方法でフィルター処理されたIQueryableですが、レンダリングまでデバッガーで機能します)。

var r =
    contacts
    .Skip(offset).Take(count)
    .Join(
        crm.ContactViews,
        c => c.Id,
        cv => cv.Id,
        (c, cv) => new { 
            contact = c, 
            view = cv, 
            userInfo = c.ContactUsers.Select(u => new {
                name = u.User.UserName,
                id = u.UserId
            }).FirstOrDefault(),
            lastCalled = crm.CallLogs
                .Where(x => x.ContactId == c.Id)
                .OrderByDescending(x => x.CallEnd)
                .Select(log => new { date = log.CallStart, username = crm.Users.FirstOrDefault(x => x.UserId == log.Caller).UserName })
                .FirstOrDefault()
        }
    )               
    .AsEnumerable()
    .Select(c => new
    {
        id = c.contact.Id,
        firstName = c.contact.FirstName,
        lastName = c.contact.LastName,
        dateCreated = formatDate(c.contact.DateCreated),
        score = c.contact.Score,

        companyName = c.view.Company,
        phone = c.view.Phone,
        email = c.view.Email,
        street = c.view.Street,
        street2 = c.view.Street2,
        city = c.view.City,
        state = c.view.State,
        zip = c.view.Zip,

        assignedUserName = c.userInfo != null ? c.userInfo.name : null,
        assignedUserId = c.userInfo != null ? c.userInfo.id : (Guid?)null,

        dateLastCalled = c.lastCalled != null ? formatDate(c.lastCalled.date) : null,
        lastCalledBy = c.lastCalled != null ? c.lastCalled.username : null
    });
4

3 に答える 3

1

通常の除去プロセスを通じて、匿名オブジェクトを使用して問題を結合ステートメントに絞り込みました。

var r =
contacts
.Skip(offset).Take(count)
.Join(
    crm.ContactViews,
    c => c.Id,
    cv => cv.Id,
    (c, cv) => new ContactJoin(){ 
        contact = c, 
        view = cv, 
        test = c.Score // <-- this line
    }
)               
.AsEnumerable()
.Select(c => new
{
    id = c.contact.Id,
    firstName = c.contact.FirstName,
    lastName = c.contact.LastName,
    score = c.test,
});

行を削除test = c.Scoreすると、エラーが修正されます。さらにテストを行ったところ、「コンストラクターの引数の数が正しくありません」というエラーが匿名オブジェクトからスローされていたため、回避策は結合を強く型付けすることです。

.Join(
    crm.ContactViews,
    c => c.Id,
    cv => cv.Id,
    (c, cv) => new ContactJoin(){ 
        contact = c, 
        view = cv, 
        userInfo = c.ContactUsers.Select(u => new UserInfo(){
            name = u.User.UserName,
            id = u.UserId
        }).FirstOrDefault(),
        lastCalled = crm.CallLogs
            .Where(x => x.ContactId == c.Id)
            .OrderByDescending(x => x.CallEnd)
            .Select(log => new LastCall(){ 
                date = log.CallStart, 
                username = crm.Users.FirstOrDefault(x => x.UserId == log.Caller).UserName 
            })
            .FirstOrDefault()
    }
)   

それでも、保守性のために問題の根本を見つけたいと思います。

于 2013-02-14T20:50:31.317 に答える
1

.NET 4.5にアップグレードした後、匿名オブジェクトのプロパティの順序が原因で、このような投影が失敗することがわかりました。

(t1, t2) => new { Thing1 = t1, Thing2 = t2, Thing1Prop1 = t1.Prop1, Thing2Prop1 = t2.Prop1 };

順序をに切り替える

(t1, t2) => new { Thing1Prop1 = t1.Prop1, Thing2Prop1 = t2.Prop1, Thing1 = t1, Thing2 = t2 };

これを修正しましたが、他のシナリオはまだ試していません。これは、壊滅的で厄介な変化のようです。

于 2013-07-09T21:09:50.900 に答える
0

私は次のことを知りました:

this.Configuration.ProxyCreationEnabled = falseDbContextベースのクラスに追加する必要がありました。

事実上、これはEF6.xの大規模な最適化を無効にします。

そうしないと、このコードは実行されず、同じエラーが返されます。

(ApiControllerベースのクラス)

public IHttpActionResult Surveys(int filterscount, int groupscount, 
       int pagenum, int pagesize, int recordstartindex, int recordendindex)
{
    var data = _dbContext.Surveys.OrderByDescending(o => o.ID)
                                 .Skip(pagenum * pagesize)
                                 .Take(pagesize)
                                 .ToList();         
    return Ok(data);
}
于 2014-08-24T12:30:20.240 に答える