2011-09-08 53 views
4

我收到以下錯誤查詢實體類型'的顯式建築是不允許

Explicit construction of entity type '...TableClassName' in query is not allowed. 

Server stack trace: 
    at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter) 
    at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

這裏是我的代碼。

tgdd = new List<TableClassName>(); 
    context.DeferredLoadingEnabled = false; 
    var t = context.TableClassName.Where(...) 
            .GroupBy(g => new { g.Date, g.UserID }) 
            .Select(g => new TableClassName 
            { 
             PK = 1, 
             Date = Convert.ToDateTime(g.Key), 
             Counted = g.Sum(x => x.Counted), 
             Time = g.Sum(x => x.Time), 
             MaxHR = g.Max(x => x.MaxHR), 
             PeakCal = g.Max(x => x.PeakCal), 
             PowerIndex = (g.Sum(x => x.PowerIndex)), 
             Target = g.Max(x => x.Target), 
             RepTotal = g.Sum(x => x.RepTotal), 
             Lifted = g.Sum(x => x.Lifted), 
             UserID = Convert.ToInt64(g.Key) 
            }).ToList(); 

         foreach (TableClassName r in t) 
         { 
          tgdd.Add(r); 
         } 

我沒有語法錯誤。這是一個Web服務。調用它時我會遇到問題。

回答

3

我使用匿名類型來解決此問題(刪除關鍵字」新「後的TableClassName)。

然後,我有另外一個問題,通過VAR迭代,用我的TableClassName(誤差由於VAR是匿名的內容)。

我迭代了var,使用var,然後將每個var的內容逐個提取到我的對象中,然後將該對象添加到我的列表中,如最初所期望的那樣。這是我的代碼。

foreach (var v in t) 
{ 
    TableClassName tgData = new TableClassName(); 
    tgData.PK = v.PK; 
    tgData.Date = v.Date; 
    tgData.Counted= v.Counted; 
    tgData.Time = v.Time; 
    tgData.MaxHR = v.MaxHR; 
    tgData.PeakCal = v.PeakCal; 
    tgData.PowerIndex = v.PowerIndex; 
    tgData.Target = v.Target; 
    tgData.RepTotal = v.RepTotal; 
    tgData.Lifted = v.Lifted; 
    tgData.UserID = v.UserID; 
    tgdd.Add(tgData); 
} 

希望這可以幫助別人。

3

考慮以下幾點:

context.DeferredLoadingEnabled = false; 
tgdd = context.TableClassName.Where(...) 
          .GroupBy(g => new { g.Date, g.UserID }) 
          .AsEnumerable() 
          .Select(g => new TableClassName 
          { 
            PK = 1, 
            Date = Convert.ToDateTime(g.Key), 
            Counted = g.Sum(x => x.Counted), 
            Time = g.Sum(x => x.Time), 
            MaxHR = g.Max(x => x.MaxHR), 
            PeakCal = g.Max(x => x.PeakCal), 
            PowerIndex = (g.Sum(x => x.PowerIndex)), 
            Target = g.Max(x => x.Target), 
            RepTotal = g.Sum(x => x.RepTotal), 
            Lifted = g.Sum(x => x.Lifted), 
            UserID = Convert.ToInt64(g.Key) 
           }).ToList(); 

通過集團化運作後致電AsEnumerable,我們強迫投射到客戶端上的自定義類型,而不是在服務器裏的服務donesn't瞭解您的自定義類型。此外,通過在查詢上調用ToList,您不需要遍歷結果並將它們添加到另一個列表中。只需將第一個ToList的結果直接到你正在返回的對象。

+0

您希望非常小心如何將其轉換爲SQL。既然你現在正在做的內存,而不是數據庫的集合,它就像變成一個呼籲'SELECT DISTINCT數據,用戶ID FROM TableName'緊接着又呼籲每一組匹配的第一個電話的結果是行的,這可能意味着用數千個單一的數據庫調用來替代(我已經有多次對這個潛行進行了改變)。查看我的回答http://stackoverflow.com/a/11805099/400547對此進行檢查。 –

0

這是可能的,如果你沒有創建的表]一個新的派生類-Attribute這樣的:

public class TableClassNameLocal : TableClassName 
{ 
} 

然後您可以創建「TableClassNameLocal」內選擇的一個實例。鑄造新的實例直接向「TableClassName」,也將努力!

result = new List<TableClassName>(); 
context.DeferredLoadingEnabled = false; 
var t = context.TableClassName.Where(...) 
           .GroupBy(g => new { g.Date, g.UserID }) 
           .Select(g => (TableClassName)new TableClassNameLocal 
           { 
            PK = 1, 
            Date = Convert.ToDateTime(g.Key), 
            Counted = g.Sum(x => x.Counted), 
            Time = g.Sum(x => x.Time), 
            MaxHR = g.Max(x => x.MaxHR), 
            PeakCal = g.Max(x => x.PeakCal), 
            PowerIndex = (g.Sum(x => x.PowerIndex)), 
            Target = g.Max(x => x.Target), 
            RepTotal = g.Sum(x => x.RepTotal), 
            Lifted = g.Sum(x => x.Lifted), 
            UserID = Convert.ToInt64(g.Key) 
           }).ToList(); 
0

這爲我工作:

var roles = (from r in roleNames 
            join rm in DataContext.FMC_RoleMaps on r equals rm.RoleName_old 
            select new 
            { 
             dnnUser.UserID, 
             rm.RoleID 
            } 
              ); 
         foreach (var userRole in roles) 
         { 
          var newrole = new UserRole() 
              { 
               RoleID = userRole.RoleID, 
               UserID = userRole.UserID 
              }; 
          DataContext.UserRoles.InsertOnSubmit(newrole); 
         } 
相關問題