9

Guid1 つのクエリからID (タイプ) を取得する必要があります。

var firstQuery = 
    from rooms in myEntityContext.Room.Where(t => t.fldClosed == 0)
    join conts in myEntityContext.Cont on rooms.ID equals conts.ItemID
    select new
    {
        ContPrice = conts.Price,
        RoomPrice = rooms.Price
        IDs = rooms.ID
    };

foreach (var t in firstQuery)
{
    t.RoomPrice  = t.ContPrice;
}

それから何らかの操作 (価格の更新) を行い、最後に 2 番目のクエリで ID を使用します。その 2 番目のクエリには、これらの ID が含まれていません。この問題を次のように実装しました。

var myIDs = firstQuery.Select(cr => cr.IDs).ToList();

そして、私の2番目のクエリは次のとおりです。

var secondQuery = 
    from rooms in myEntityContext.Room.Where(t => t.fldClosed == 0) 
    where !myIDs.Contains(rooms.fldID)                                   
    join conts in myEntityContext.Cont on rooms.ID equals conts.ItemID
    select new
    {
       RoomPrice = conts.fldPrice,
       IDs = rooms.ID
    };

このコードをデバッガー モードで実行すると、次の行に到達します。

var myIDs = firstQuery.Select(cr => cr.IDs).ToList();

...例外が発生します:

NullReferenceException
オブジェクト参照がオブジェクトのインスタンスに設定されていません。

2番目のクエリを別のメソッドに転送してIDを渡すとすべてが完全に機能するため、2番目のクエリと関係があるようですが、変数の後に記述されたクエリを考慮する必要がある理由がわかりません初期化中。

コード全体は次のとおりです。

var calcDate = DateTime.Now.AddDays(-1);

var firstQuery = 
    from rooms in myEntityContext.Room.Where(t => t.fldClosed == 0)
    join conts in myEntityContext.Cont on rooms.ID equals conts.ItemID
    where conts.date == calcDate
    select new
    {
        ContPrice = conts.Price,
        RoomPrice = rooms.Price
        IDs = rooms.ID
    };

foreach (var t in firstQuery)
{
    t.RoomPrice = t.ContPrice;
}

var myIDs = firstQuery.Select(cr => cr.IDs).ToList();


var secondQuery = 
    from rooms in myEntityContext.Room.Where(t => t.fldClosed == 0) 
    where !myIDs.Contains(rooms.fldID)                                   
    join conts in myEntityContext.Cont on rooms.ID equals conts.ItemID
    where conts.date == calcDate && conts.Code = "01"
    select new
    {
       RoomPrice = conts.fldPrice,
       IDs = rooms.ID
    };

foreach (var t in secondQuery)
{
    ContPrice = Conts.Price,
    RoomPrice = Rooms.Price
}

myEntityContext.SaveChanges();

役に立つ場合は、これが私のスタック トレースです。

Financial.UI.dll!Financial.UI.Services.Hotels.HotelServiceProxy.CalcProxy.DoCalc(System.DateTime calcDate) 行 5055 C#
Financial.UI.dll!Financial.UI.Pages.Hotel.NightsCalculationPage.CallbackMethod_DoCalc() 65 行目 + 0x37 バイト C#
[管理された移行にネイティブ]  
Web.UI.dll!Web.UI.SystemCallback.ProcessCallback() 行 228 + 0x3b バイト C#
Web.UI.dll!Web.UI.SystemCallbackHandler.ProcessRequest(System.Web.HttpContext コンテキスト) 68 行目 + 0x12 バイト C#
System.Web.dll!System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 0x156 バイト    
System.Web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep ステップ、ref bool completedSynchronously) + 0x46 バイト
System.Web.dll!System.Web.HttpApplication.PipelineStepManager.ResumeSteps(System.Exception エラー) + 0x342 バイト
System.Web.dll!System.Web.HttpApplication.BeginProcessRequestNotification(System.Web.HttpContext コンテキスト、System.AsyncCallback cb) + 0x60 バイト
System.Web.dll!System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest wr, System.Web.HttpContext コンテキスト) + 0xbb バイト   
System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(System.IntPtr rootedObjectsPointer、System.IntPtr nativeRequestContext、System.IntPtr moduleData、int フラグ) + 0x1f3 バイト   
System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(System.IntPtr rootedObjectsPointer、System.IntPtr nativeRequestContext、System.IntPtr moduleData、int フラグ) + 0x1f バイト  
[管理された移行にネイティブ]  
【マネージドからネイティブへの移行】  
System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(System.IntPtr rootedObjectsPointer、System.IntPtr nativeRequestContext、System.IntPtr moduleData、int フラグ) + 0x350 バイト   
System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(System.IntPtr rootedObjectsPointer、System.IntPtr nativeRequestContext、System.IntPtr moduleData、int フラグ) + 0x1f バイト  
【アプリドメイン移行】  
4

5 に答える 5

5

スタック トレース便利です。投稿したコードはDoCalc()メソッド内にあると思います。ただし、投稿した行がコードの 5055 行目である可能性はありません。

var myIDs = firstQuery.Select(cr => cr.IDs).ToList();

この行でaNullReferenceExceptionが発生するには、firstQuerynull にするか、nullfirstQuery.Select(cr => cr.IDs)を返す必要があります...

ただし、この場合は、 ではなくArgumentNullException両方のケースで を取得します。したがって、それはエラーのある行ではありません。NullReferenceException


また、あなたのコードは実行されるべきではありません!

たとえば、次の部分では、コンパイル時にエラーが発生するはずです。

foreach (var t in firstQuery)
{
    t.RoomPrice = t.ContPrice;
}

プロパティまたはインデクサー 'AnonymousType#1.RoomPrice' を割り当てることはできません -- 読み取り専用です

ここで何をしようとしているのか...わかりません:

foreach (var t in secondQuery)
{
    ContPrice = Conts.Price,
    RoomPrice = Rooms.Price
}

最も起こりそうなこと

nullinmyEntityContext.Roomまたは in がありますmyEntityContext.Cont。それらの内容を見て、これを確認してください。それでもわからない場合は、例外が発生したときに、Visual Studio (例外ウィンドウ) で [例外の詳細をクリップボードにコピー] をクリックし、質問に貼り付けます。

于 2013-02-27T15:58:41.647 に答える
3

このコードはコンパイルされません。したがって、ある時点でコンパイルされ、すべての Rooms と Cont が null オブジェクトを含まない実際のインスタンスであると仮定すると、匿名の戻り値が使用される可能性があります。

これを試して

public class QueryResult
{
    public decimal ContPrice; //whatever your types are

    public decimal RoomPrice;

    public int IDs;
}

次に、次のように使用します。

var firstQuery =
    from rooms in myEntityContext.Room.Where(t => t.fldClosed == 0)
    join conts in myEntityContext.Cont on rooms.ID equals conts.ItemID
    where conts.date == calcDate
    select new QueryResult
                {
                    ContPrice = conts.Price,
                    RoomPrice = rooms.Price,
                    IDs = rooms.ID
                };

var firstQueryResult = firstQuery.ToList();

foreach (var t in firstQueryResult)
{
    t.RoomPrice = t.ContPrice;
}

他の人が言ったように、複数回列挙することは避けてください。

また、2 番目のクエリを削除し、最初の作業を最初に取得します... 2 番目のクエリにはいくつかの問題があります。まず、結果として再び匿名型になります。これは、linq 間で使用されることになっているため、乱用です。強い型に解決する必要があります。第二に、

... && conts.Code = "01"

コンパイルされず、次のようにする必要があります。

conts.Code.Equals("01")

また、クエリを小さな部分に分割することをお勧めします。おそらくこのようなもの

var roomsOpenQuery = myEntityContext.Room.Where(t => t.fldClosed == 0);
var roomsOpenQueryResolved = roomsOpenQuery.ToList();
var contQuery = myEntityContext.Cont
    .Where(t => roomsOpenQueryResolved.Any(r => r.ID == t.ItemID))
    .Where(x => x.date == calcDate);


var availableRooms =
    contQuery
        .Join(roomsOpenQueryResolved,
                c => c.ItemID,
                r => r.ID,
                (c, r) => new AvailableRoom()
                            {
                                ContPrice = c.Price,
                                RoomPrice = r.Price,
                                IDs = c.ItemID
                            })
        .ToList();


//Price Adjustment etc...
于 2013-03-02T08:29:07.943 に答える
2

var FirstQueryIEnumerable< out T >に解決されると思います。

Enumerableのコンテンツに複数回アクセスすることはできません。

最初のクエリでリストを作成してみてください:

var FirstQuery = (from rooms in myEntityContext.Room.Where(t => t.fldClosed == 0)                                    
    join Conts in myEntityContextt.Cont on rooms.ID equals Conts.ItemID
    select new
    {
        RoomPrice = Conts.fldPrice,
        IDs = rooms.ID
    }).ToList();

この行が失敗した場合、myEntityContext.Mark または myEntityContext.Cont はおそらく null オブジェクトです

于 2013-02-19T11:35:03.113 に答える
1
var myIDs = new List<int>();
if( firstQuery.Count() > 0)
myIds =  firstQuery.Select(cr => cr.IDs).ToList();
于 2013-02-27T16:16:57.877 に答える
1

IDs IDs = rooms.ID は null になる可能性があります。

これを追加してみてください: var myIDs = FirstQuery.ToList().Select(Cr => Cr.IDs).ToList();

于 2013-02-26T15:25:18.140 に答える