Entity framework 实体框架代码第一次左连接

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)

我首先在EF代码中创建了一个简单的DB,但似乎遇到了问题

我想做的是,查询DBContext以检索一个自定义对象CheckedTag,该对象将包含所有可用标记和一个布尔字段checked

代码首先抽象了多对多表,我似乎找不到正确的查询

我试过了

            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,你刚刚为我解决了一个头疼的问题:)