2015-02-02 3 views
-1

У меня есть этот запрос,все записи не в другой таблице и записей, которые соответствуют условию в другой таблице LINQ

IEnumerable<AssetNotCheckOutReportItem> aco = 
     (from i in dbCon.nfoInventories 
     join a in dbCon.asset_status on i.asset_id equals a.asset_id 
     join emp in dbCon.nfoEmployees on a.jv_id equals emp.jv_id      
     where (a.checked_in != null) 
     select new Reports.AssetNotCheckOutReportItem 
     { 
       asset_id = a.asset_id, 
       inv_desc = i.inv_desc, 
       jvid=a.jv_id, 
       fullname = emp.fullname, 
       checked_out = a.checked_out, 
       checked_in = a.checked_in 
     }); 

Я также хочу, чтобы включить инвентарь, который не найден в таблице asset_status. Эти записи не будут иметь информацию о сотруднике и возвратят значение null для jv_id, fullname, checked_in и checked_out.

Я сделал правильный SQL-запрос, который возвращает результаты, которые я хочу.

select * from nfoInventory as i 
left outer join asset_status a on i.asset_id = a.asset_id 
left outer join nfoEmployee as e on a.jv_id = e.jv_id 
where i.asset_id not in (Select asset_id from asset_status where checked_in is null) 

Но я до сих пор не в состоянии заставить его работать с Linq для лиц

я попытался

IEnumerable<AssetNotCheckOutReportItem> aco = (
     from i in dbCon.nfoInventories 
     from asset in dbCon.asset_status.Where(a => a.asset_id == i.asset_id).DefaultIfEmpty() 
     from emp in dbCon.nfoEmployees.Where(ne => ne.jv_id == asset.jv_id).DefaultIfEmpty() 
     where (asset.checked_in != null) 
     select new Reports.AssetNotCheckOutReportItem 
     { 
       asset_id = i.asset_id, 
       inv_desc = i.inv_desc, 
       jvid=a.jv_id, 
       fullname = emp.fullname, 
       checked_out = a.checked_out, 
       checked_in = a.checked_in 
     }); 

Но получить:

LINQ для лиц, не признающих метод 'System.Linq.IQueryable`1 [Lester.Model.asset_status] DefaultIfEmpty [ass et_status] [System.Linq.IQueryable`1 [Lester.Model.asset_status]) ' , и этот метод не может быть переведен в выражение хранилища.

Я попытался

IEnumerable<AssetNotCheckOutReportItem> aco = (
      from i in dbCon.nfoInventories 
      join a in dbCon.asset_status on i.asset_id equals a.asset_id 
      join emp in dbCon.nfoEmployees on a.jv_id equals emp.jv_id 
      where (a.checked_in != null) || !(from c in dbCon.asset_status select c.asset_id).Contains(a.asset_id) 
      select new Reports.AssetNotCheckOutReportItem 
     { 
       asset_id = i.asset_id, 
       inv_desc = i.inv_desc, 
       jvid=a.jv_id, 
       fullname = emp.fullname, 
       checked_out = a.checked_out, 
       checked_in = a.checked_in 
     }); 

и получите:

LINQ к Entities не распознает метод «Boolean Содержит [String] [System.Linq.IQueryable`1 [System .String], System.String) ', и этот метод не может быть переведен в выражение .

Я также попытался

IEnumerable<AssetNotCheckOutReportItem> aco = (from i in dbCon.nfoInventories 
     join a in dbCon.asset_status on i.asset_id equals a.asset_id 
     join emp in dbCon.nfoEmployees on a.jv_id equals emp.jv_id 
     where (a.checked_in != null) || (!dbCon.asset_status.Any(c => c.asset_id == i.asset_id)) 
     select new Reports.AssetNotCheckOutReportItem 
     { 
       asset_id = i.asset_id, 
       inv_desc = i.inv_desc, 
       jvid=a.jv_id, 
       fullname = emp.fullname, 
       checked_out = a.checked_out, 
       checked_in = a.checked_in 
     }); 

Но получить те же результаты, как мой первоначальный запрос. Просто активы, которые отмечены check_in, но не активы, которые никогда не проверялись.

Как я могу это сделать? Спасибо

+2

Вещь, которую вы ищете, - это левое соединение. Существует уже много вопросов о том, как выполнять левое соединение с помощью LINQ. – MarcinJuraszek

ответ

0

Я никогда не мог получить эту работу, используя один запрос. Я, наконец, сделал 2 запроса и объединил результаты.

IEnumerable<AssetNotCheckOutReportItem> returned = (from a in dbCon.asset_status 
                join emp in dbCon.nfoEmployees on a.jv_id equals emp.jv_id 
                join i in dbCon.nfoInventories on a.asset_id equals i.asset_id 
                where (a.checked_in != null) 
                select new Reports.AssetNotCheckOutReportItem { 
                 asset_id = a.asset_id, 
                 inv_desc = i.inv_desc, 
                 jvid = a.jv_id, 
                 fullname = emp.fullname, 
                 checked_out = a.checked_out, 
                 checked_in = a.checked_in 
                }); 

IEnumerable<AssetNotCheckOutReportItem> notcheckedout = from i in dbCon.nfoInventories 
                 where (!dbCon.asset_status.Any(c => c.asset_id == i.asset_id)) 
                 select new Reports.AssetNotCheckOutReportItem { 
                      asset_id = i.asset_id, 
                      inv_desc = i.inv_desc, 
                      jvid = null, 
                      fullname = null, 
                      checked_out = null, 
                      checked_in = null 
                 }; 

IEnumerable<AssetNotCheckOutReportItem> assets = returned.Union(notcheckedout).OrderBy(q => q.asset_id); 
Смежные вопросы