Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq使用多行子查询进行查询(无连接)_C#_Linq - Fatal编程技术网

C# Linq使用多行子查询进行查询(无连接)

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

我想像在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' );
我试过:

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();