如何解决为什么这个额外的联接会增加查询数量?
| 我无法提出有效的LINQ-to-SQL查询。我正在尝试做这样的事情:from x in Items
select new
{
Name = x.Name
TypeARelated = from r in x.Related
where r.Type == \"A\"
select r
}
如您所料,它将在\“ Items \”表中生成一个查询,并在\“ Related \”表中进行左连接。现在,如果我再添加一些类似的行...
from x in Items
select new
{
Name = x.Name
TypeARelated = from r in x.Related
where r.Type == \"A\"
select r,TypeBRelated = from r in x.Related
where r.Type == \"B\"
select r
}
结果是运行与第一次尝试类似的查询,然后针对\“ Items \”中的每个记录对\“ Related \”表进行单独查询。有没有办法将这些全部包装在单个查询中?这是什么原因?在此先感谢您提供的任何帮助。
解决方法
如果上面的查询直接用SQL编写,则将这样编写(伪代码):
SELECT
X.NAME AS NAME,(CASE R.TYPE WHEN A THEN R ELSE NULL) AS TypeARelated,(CASE R.TYPE WHEN B THEN R ELSE NULL) AS TypeBRelated
FROM Items AS X
JOIN Related AS R ON <some field>
但是,linq-to-sql效率不高,从您的解释来看,它执行一个连接,然后分别比较每个记录。更好的方法是使用两个类似于第一个示例的linq查询,这将生成两个SQL查询。然后,使用两个linq查询的结果并将其联接,这将不会生成任何SQL语句。此方法会将在SQL中执行的查询数限制为2。
如果条件类型ierType == \“ A \”等,随着时间的推移会增加,或者要添加不同的条件,那么最好使用存储过程,这将是一个SQL查询每时每刻。
哈萨那
,您可以使用紧急加载在服务器上进行单个联接,以查看是否有帮助。试试看。
using (MyDataContext context = new MyDataContext())
{
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Item>(i => i.Related);
context.LoadOptions = options;
// Do your query now.
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。