1

最初のクエリの結果セットを 2 番目のクエリで使用する 2 つの LINQ クエリを作成しています。

しかし、場合によっては、データベース テーブルにデータがない場合、最初のクエリが null を返すため、2 番目のクエリが失敗しwsdetails.location、例外wsdetails.worklocationnull発生します。

例外:

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

私のコードはこれです:

        var wsdetails = (from assetTable in Repository.Asset
                         join userAsset in Repository.UserAsset on
                         assetTable.Asset_Id equals userAsset.Asset_Id
                         join subLocationTable in Repository.SubLocation on
                         assetTable.Sub_Location_Id equals subLocationTable.Sub_Location_ID
                         where userAsset.User_Id == userCode
                         && assetTable.Asset_TypeId == 1 && assetTable.Asset_SubType_Id == 1
                         select new { workstation = subLocationTable.Sub_Location_Name, location = assetTable.Location_Id }).FirstOrDefault();


            result = (from emp in this.Repository.Employee
                      join designation in this.Repository.Designation on
                      emp.DesignationId equals designation.Id
                      where emp.Code == userCode
                      select new EmployeeDetails
                      {                             
                          firstname = emp.FirstName,
                          lastname = emp.LastName,                              
                          designation = designation.Title,
                          LocationId = wsdetails.location,
                          WorkStationName = wsdetails.workstation
                      }).SingleOrDefault();

私が確認できる回避策として

if wsdetails == null

null2 つ目の LINQ ロジックを変更しますが、演算子のように LINQ 自体で値を処理する方法がいくつかあると思います??

しかし、私はこれを試しましたが、うまくいきませんでした。

何か助けはありますか?

4

3 に答える 3

2

問題は、EFがnull合体演算子をSQLに変換できないことです。個人的には、次のクエリを実行する前にifステートメントで結果をチェックすることの何が問題になっているのかわかりません。ただし、それを実行したくない場合は、結果が常に単一のクエリになるため、次のようなことをしないでください。

var wsdetails = (from assetTable in Repository.Asset 
                 join userAsset in Repository.UserAsset on 
                 assetTable.Asset_Id equals userAsset.Asset_Id 
                 join subLocationTable in Repository.SubLocation on 
                 assetTable.Sub_Location_Id equals subLocationTable.Sub_Location_ID 
                 where userAsset.User_Id == userCode 
                 && assetTable.Asset_TypeId == 1 && assetTable.Asset_SubType_Id == 1 
                 select new { workstation = subLocationTable.Sub_Location_Name, location = assetTable.Location_Id }).FirstOrDefault();  

result = (from emp in this.Repository.Employee 
          join designation in this.Repository.Designation on 
          emp.DesignationId equals designation.Id 
          where emp.Code == userCode 
          select new EmployeeDetails 
          {                              
              firstname = emp.FirstName, 
              lastname = emp.LastName,                               
              designation = designation.Title
           }).SingleOrDefault();

result.LocationId = wsdetails != null ? wsdetails.location : "someDefaultValue";
result.WorkStationName = wsdetails != null ? wsdetails.workstation ?? "someDefaultValue"; 
于 2012-08-22T12:07:30.170 に答える
2

「二項」演算子の代わりに、??古き良き三項演算子を使用する必要があるかもしれません? :

wsdetails != null ? wsdetails.location : null
于 2012-08-22T11:59:30.030 に答える
1

最初のクエリを評価しないようにして、2 番目のクエリで使用してください。これにより、単一の SQL ステートメントが生成されます。

var wsdetails = (from assetTable in Repository.Asset
                         join userAsset in Repository.UserAsset on
                         assetTable.Asset_Id equals userAsset.Asset_Id
                         join subLocationTable in Repository.SubLocation on
                         assetTable.Sub_Location_Id equals subLocationTable.Sub_Location_ID
                         where userAsset.User_Id == userCode
                         && assetTable.Asset_TypeId == 1 && assetTable.Asset_SubType_Id == 1
                         select new { workstation = subLocationTable.Sub_Location_Name, location = assetTable.Location_Id });
// wsdetails is still an IEnumerable/IQueryable


        result = (from emp in this.Repository.Employee
                  join designation in this.Repository.Designation on
                  emp.DesignationId equals designation.Id
                  where emp.Code == userCode
                  select new EmployeeDetails
                  {                             
                      firstname = emp.FirstName,
                      lastname = emp.LastName,                              
                      designation = designation.Title,
                      LocationId = wsdetails.First().location,
                      WorkStationName = wsdetails.First().workstation
                  }).SingleOrDefault();
于 2012-08-22T12:02:27.980 に答える