У меня есть этот запрос,все записи не в другой таблице и записей, которые соответствуют условию в другой таблице 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, но не активы, которые никогда не проверялись.
Как я могу это сделать? Спасибо
Вещь, которую вы ищете, - это левое соединение. Существует уже много вопросов о том, как выполнять левое соединение с помощью LINQ. – MarcinJuraszek