【问题标题】:how to convert T-SQL Query to linq如何将 T-SQL 查询转换为 linq
【发布时间】:2012-09-06 14:42:34
【问题描述】:

我在 SQL 中有 4 个表:DocumentType,ClearanceDocument,Request,RequestDocument
我想在页面加载和用户选择一个请求时,在RequestTable 中显示所有基于clearanceType 的文档,并在RequestDocumentexist 设置is_exist=true 时签入

我已经用SqlServer Query Editor 编写了这个查询以获得这个场景的结果,但是我不能把这个查询转换成 Linq

    select *,
    is_Orginal=
    (select is_orginal from CLEARANCE_REQUEST_DOCUMENT 
    where 
    DOCUMENT_ID=a.DOCUMENT_ID and REQUEST_ID=3)
    from 
    DOCUMENT_TYPES a
    where 
    DOCUMENT_ID in 
    (select DOCUMENT_ID from CLEARANCE_DOCUMENTS dt 
    where 
    dt.CLEARANCE_ID=
    (SELECT R.CLEARANCE_TYPE FROM CLEARANCE_REQUEST R 
    WHERE 
    R.REQUEST_ID=3)) 

我在 linq 中写了这个查询,但不起作用

 var list = (from r in context.CLEARANCE_REQUEST
                        where r.REQUEST_ID == 3
                        join cd in context.CLEARANCE_DOCUMENTS on r.CLEARANCE_TYPE equals cd.CLEARANCE_ID
                        join dt in context.DOCUMENT_TYPES on cd.DOCUMENT_ID equals dt.DOCUMENT_ID into outer
                        from t in outer.DefaultIfEmpty()
                        select new
                                   {
                                        r.REQUEST_ID,
                                        cd.CLEARANCE_ID,
                                        t.DOCUMENT_ID,
                                        t.DOCUMENT_NAME,
                                        is_set=(from b in context.CLEARANCE_REQUEST_DOCUMENT where 
                                                    b.REQUEST_ID==r.REQUEST_ID && b.DOCUMENT_ID==t.DOCUMENT_ID
                                                    select new{b.IS_ORGINAL})
                                   }

                       ).ToList();

我想将此查询转换为LINQ。请帮我。谢谢。

【问题讨论】:

  • @M.B.: 究竟是什么不起作用?您是否收到编译器错误?运行时异常?出乎意料的结果?
  • @M.B. - 对不起,我编辑了帖子,你发布的后面部分已经消失了。你能再把它说一遍吗?我的错。
  • @Shaks:np,我编辑问题并添加我的 linq 代码。
  • 请用简单的英语解释查询应该返回什么。
  • SQL 返回DOCUMENT_TYPES.*BITis_original,但您的LINQ 尝试从一系列对象返回属性。它们完全不同。

标签: c# linq entity-framework


【解决方案1】:

无需手动连接从实体框架上下文返回的对象。

Why use LINQ Join on a simple one-many relationship?

如果您按预期使用框架,您的工作会容易得多。

var result = var clearanceTypes = context.CLEARANCE_REQUEST
    .Single(r => r.REQUEST_ID == 3)
    .CLEARANCE_DOCUMENTS
    .SelectMany(dt => dt.DOCUMENT_TYPES)
    .Select(a => new 
    {
        DocumentType = a,
        IsOriginal = a.CLEARANCE_REQUEST_DOCUMENT.is_original
    });

【讨论】:

  • @Kirk Broadhurst:感谢您的帮助,但 Clearance_Request 和 Clearance_document 之间没有关系。 request 只是跟 Clearance_Request_Document 有关系
【解决方案2】:

由于在迭代数据之前不会执行查询,因此您可以将查询拆分为多个子查询,以帮助您获得如下结果:

var clearanceIds = context.CLEARANCE_REQUEST
                          .Where(r => r.REQUEST_ID == 3)
                          .Select(r => r.CLEARANCE_TYPE);
var documentIds = context.CLEARANCE_DOCUMENTS
                         .Where(dt => clearanceIds.Contains(dt.CLEARANCE_ID))
                         .Select(dt => dt.DOCUMENT_ID);
var result = context.DOCUMENT_TYPES
                    .Where(a => documentIds.Contains(a.DOCUMENT_ID))
                    .Select(a => new
                    {
                        // Populate properties here
                        IsOriginal = context.CLEARANCE_REQUEST_DOCUMENT
                                            .Single(item => item.DOCUMENT_ID == a.DOCUMENT_ID &&
                                                              item.REQUEST_ID == 3)
                                            .IS_ORIGINAL
                    })
                    .ToList();

【讨论】:

    猜你喜欢
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    相关资源
    最近更新 更多