我创建了一个代码优先的数据库,问题是我在将这个SQL语句转换为C#代码时遇到了一些困难。
下面是我需要帮助进行调整的SQL语句以及我当前使用的表。此SQL查询的目标是在表上TableViewedMessageLog是一个记录,其中哪个用户看到哪条消息和所需的效果是选择所有消息Non-Read(哪些信息存储在此表 - TableViewMessageLogs)给某个用户。
http://gyazo.com/0105c0959bdd2930272bf5c07a112a11
select * from TableMessages tm
where tm.Id not in (select tv.Message_Id from TableViewedMessageLogs as tv
where tv.User_Email = 'asd@asd')
答案 0 :(得分:2)
尝试此查询:
var data = from f in context.TableMessages
where f.id !=
(
from fb in TableViewedMessageLogs
where User_Email == 'asd@asd'
select fb.Message_Id
)
select f;
答案 1 :(得分:1)
试试这个:
var data = (from e in context.TableMessages
where context.TableViewedMessageLogs
.Where(x => x.User_Email == 'asd@asd')
.Select(x => x.Message_Id).Contains(e.Id) == false
select e)
.ToList();
答案 2 :(得分:1)
你可以这样做,以防止子查询,提供更好的性能,并使它更容易理解发生了什么:
var viewedLogs = context.TableViewedMessageLogs.Where(w => w.User_Email = 'asd@asd');
var result = context.TableMessages.Where(w => !viewedLogs.Contains(w.Id));