C# Linq使用多行子查询进行查询(无连接)
我想像在MySql中一样使用多行子查询进行查询,但我想在不使用C# Linq使用多行子查询进行查询(无连接),c#,linq,C#,Linq,我想像在MySql中一样使用多行子查询进行查询,但我想在不使用join的情况下执行,因此我的sql查询是: select * from html_files_tab where html_files_tab.encoded_id in (select html_src_files_relationsip_tab.file_fk from html_src_files_relationsip_tab where html_src_files_relationsip_tab.src_fk == '1
join
的情况下执行,因此我的sql查询是:
select * from html_files_tab where html_files_tab.encoded_id in
(select html_src_files_relationsip_tab.file_fk from html_src_files_relationsip_tab where html_src_files_relationsip_tab.src_fk == '1' );
我试过:
var fileBeans = ( from srcFileTab in conn.Table<FileBean>() where
srcFileTab.fileId in ( from srcFileRelationSipTab in
conn.Table<HtmlSrcFileRelationship>() where
srcFileRelationSipTab.srcFk == encodedSrcId select
srcFileRelationSipTab.fileFk ) select srcFileTab ).ToList();
完整堆栈跟踪:
at SQLite.Net.TableQuery`1.GenerateCommand(String selectionList)
at SQLite.Net.TableQuery`1.GetEnumerator()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at HiTech.DataBase.selectFileBeansBySrc(String encodedSrcId)
有没有一种不用加入的方法
您可以使用任何
扩展名来执行此操作
conn.Table<FileBean>()
.Select(x=> conn.Table<HtmlSrcFileRelationship>()
.Any(r=> r.srcFk == encodedSrcId && r.srcFk == x.encoded_id))
// not sure it is encoded_id or encodedSrcId in above statement. Update accordingly.
.ToList();
连接表()
.Select(x=>conn.Table()
.Any(r=>r.srcFk==encodedSrcId&&r.srcFk==x.encoded\u id))
//不确定在上面的语句中它是encoded_id还是encodedSrcId。相应更新。
.ToList();
您不能在两个单独的查询中完成吗
var fileRel = (from srcFileRelationSipTab in
conn.Table<HtmlSrcFileRelationship>() where
srcFileRelationSipTab.srcFk == encodedSrcId
select srcFileRelationSipTab.fileFk).ToList();
var fileBeans = ( from srcFileTab in conn.Table<FileBean>() where
srcFileTab.fileId in fileRel
select srcFileTab ).ToList();
var fileRel=(来自中的srcFileRelationSipTab
conn.Table()在哪里
srcFileRelationSipTab.srcFk==encodedSrcId
选择srcFileRelationSipTab.fileFk).ToList();
var fileBeans=(来自conn.Table()中的srcFileTab,其中
fileRel中的srcFileTab.fileId
选择srcFileTab).ToList();
运算符中SQL的直接LINQ等价物是方法:
var fileBeans=
(来自连接表()中的srcFileTab)
其中(来自连接表()中的srcFileRelationSipTab)
其中srcFileRelationSipTab.srcFk==encodedSrcId
选择srcFileRelationSipTab.fileFk).Contains(srcFileTab.fileId)
选择srcFileTab).ToList();
不用尝试在LinQ中重新创建SQL,您可以使用嵌套迭代的LinQ选项,该选项与子查询几乎相同
var tabs = (from srcFileTab in conn.Table<FileBean>()
from srcFileRelationSipTab in conn.Table<HtmlSrcFileRelationship>()
where srcFileRelationSipTab.srcFk == encodedSrcId
&& srcFileTab.fileId == srcFileRelationSipTab.fileFk
select srcFileTab ).ToList();
var tabs=(来自conn.Table()中的srcFileTab)
从连接表()中的srcFileRelationSipTab
其中srcFileRelationSipTab.srcFk==encodedSrcId
&&srcFileTab.fileId==srcFileRelationSipTab.fileFk
选择srcFileTab).ToList();
您可以在存在的地方使用
?我不知道你为什么要避免使用联接。。。exists只是优化为半联接。我要回显@atlaste-你能解释一下为什么不想在这里使用联接关键字吗?@atlaste,@Steve Cooper我编辑了我的问题,原因是为什么使用你的方法我会得到“EXCEPTION:System.NotSupportedException:Cannot compile:Quote”不确定这是否是最佳解决方案,但运行时没有错误,对于时间来说,使用&&
而不是第二个where
条款只会快一点你确定吗?我根据可读性在两者之间切换,但从未注意到任何差异。你对它进行了基准测试吗?是的,你也对它进行了测试,它在一次测试中快了1-3毫秒
var fileRel = (from srcFileRelationSipTab in
conn.Table<HtmlSrcFileRelationship>() where
srcFileRelationSipTab.srcFk == encodedSrcId
select srcFileRelationSipTab.fileFk).ToList();
var fileBeans = ( from srcFileTab in conn.Table<FileBean>() where
srcFileTab.fileId in fileRel
select srcFileTab ).ToList();
var fileBeans =
(from srcFileTab in conn.Table<FileBean>()
where (from srcFileRelationSipTab in conn.Table<HtmlSrcFileRelationship>()
where srcFileRelationSipTab.srcFk == encodedSrcId
select srcFileRelationSipTab.fileFk).Contains(srcFileTab.fileId)
select srcFileTab).ToList();
var tabs = (from srcFileTab in conn.Table<FileBean>()
from srcFileRelationSipTab in conn.Table<HtmlSrcFileRelationship>()
where srcFileRelationSipTab.srcFk == encodedSrcId
&& srcFileTab.fileId == srcFileRelationSipTab.fileFk
select srcFileTab ).ToList();