Entity framework 实体框架代码第一次左连接
我首先在EF代码中创建了一个简单的DB,但似乎遇到了问题 我想做的是,查询DBContext以检索一个自定义对象CheckedTag,该对象将包含所有可用标记和一个布尔字段checked 代码首先抽象了多对多表,我似乎找不到正确的查询 我试过了Entity framework 实体框架代码第一次左连接,entity-framework,linq-to-entities,many-to-many,left-join,ef-code-first,Entity Framework,Linq To Entities,Many To Many,Left Join,Ef Code First,我首先在EF代码中创建了一个简单的DB,但似乎遇到了问题 我想做的是,查询DBContext以检索一个自定义对象CheckedTag,该对象将包含所有可用标记和一个布尔字段checked 代码首先抽象了多对多表,我似乎找不到正确的查询 我试过了 var qry = from t in Db.Tags from a in Db.Articles where(a.Id == articleId)
var qry = from t in Db.Tags
from a in Db.Articles
where(a.Id == articleId)
select new CheckedTag
{
Id = t.Id,
Name = t.Name,
PermanentUrl = t.PermanentUrl,
Checked = t.Id == null ? false : true
};
在网上搜索了几个小时
如果articleId为0,则它将检索所有标记并将checked设置为false;如果articleId用于现有的项目,则将返回所有标记并将checked设置为true
有人能建议我需要使用的查询来检索以获得此结果吗?如果我理解正确,您希望获得特定文章(具有as-id'articleId)的所有标记的列表(不仅仅是它具有的标记),如果确实具有,则将“Checked”设置为true,否则为false。如果是这样的话,我想提出以下问题:
var checkedTags= from t in Db.Tags
select new CheckedTag
{
Id = t.id,
Name = t.name,
PermanentUrl = t.PermanentUrl,
Checked = t.Articles.Any(a => a.Id == articleId)
};
希望这有帮助:)
编辑:将“包含”替换为“任何”。谢谢@Yakimych.我建议对AbdouMoumen的答案稍加改进。(使用EF 4在.Net 4中测试) 我使用SQL profiler和语句“checked=t.Articles.Any(…)”进行了检查,虽然它给出了正确的结果,但会生成效率稍低的SQL代码 (注意:我的代码有不同的实体名称,但场景完全相同) 生成以下代码:
CASE WHEN ( EXISTS (SELECT
1 AS [C1]
FROM [dbo].[LocationFeatures] AS [Extent2]
WHERE ([Extent1].[FeatureID] = [Extent2].[FeatureID]) AND (1 = [Extent2].[LocationID])
)) THEN cast(1 as bit) WHEN ( NOT EXISTS (SELECT
1 AS [C1]
FROM [dbo].[LocationFeatures] AS [Extent3]
WHERE ([Extent1].[FeatureID] = [Extent3].[FeatureID]) AND (1 = [Extent3].[LocationID])
)) THEN cast(0 as bit) END AS [C1]
我通过将其更改为'Checked=(t.Articles.Any(…))进行测试?true:false'结果数据与SQL代码稍好的结果相同。
这将产生:
CASE WHEN ( EXISTS (SELECT
1 AS [C1]
FROM [dbo].[LocationFeatures] AS [Extent2]
WHERE ([Extent1].[FeatureID] = [Extent2].[FeatureID]) AND (1 = [Extent2].[LocationID])
)) THEN cast(1 as bit) ELSE cast(0 as bit) END AS [C1]
p、 也许这应该是一个评论,但我还没有发表评论的特权,所以如果我滥用这个网站,请建议我应该遵循的正确方法。你的思路是正确的,但是使用
任何而不是包含。谢谢你的评论,Abdou和Yakimych,你刚刚为我解决了一个头疼的问题:)