首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将SQL查询转换为LINQ #2

将SQL查询转换为LINQ #2
EN

Stack Overflow用户
提问于 2013-11-29 11:20:49
回答 2查看 94关注 0票数 1

我有一个包含两个表的数据库:User( idUser,firstName,lastName)Document( idDoc,title,expirationDate,UserDoc),UserDoc是idUser的外键

此外,我的C#代码中有两个类:

代码语言:javascript
复制
 public class DocumentUI
{
    public string Title { get; set; }
    public string Description { get; set; }
    public DateTime ExpirationDate { get; set; }
    public int UserDoc { get; set; }
    public UserUI User { get; set; }
}

代码语言:javascript
复制
 public class UserUI
{
    public int IdUser { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

}

我需要转换以下查询:

代码语言:javascript
复制
select a.*, (select u.lastName from Users as u where u.idUser = a.UserDoc),(select u.firstName from Users as u where u.idUser = a.UserDoc)

将文档转换为where () <= a.expirationDate

我试过了,这是很好的结果:

代码语言:javascript
复制
            var documents = (from d in DocumentDAO.GetDocument()
                             join k in UserDAO.GetUsers()
                             on d.UserDoc equals k.IdUser
                             where (DateTime.Now <= d.ExpirationDate)
                             select new DocumentUI
                             {
                                 Title = d.Title,
                                 Description = d.Description,
                                 DateOfAdd = d.DateOfAdd,
                                 ExpirationDate = d.ExpirationDate,
                                 UserDoc = d.UserDoc,
                                 User = new UserUI { FirstName = k.FirstName, LastName = k.LastName}

                             }).ToList();

但是在调试器中,我注意到它没有看到任何文档(我检查并有一个应该返回)。

我也试过这样做:

代码语言:javascript
复制
            var documents = (from d in DocumentDAO.GetDocument()
                             from k in UserDAO.GetUsers().Where(k =>k.IdUser == d.UserDoc
                             where (DateTime.Now <= d.ExpirationDate)
                             select new DocumentUI
                             {
                                 Title = d.Title,
                                 Description = d.Description,
                                 DateOfAdd = d.DateOfAdd,
                                 ExpirationDate = d.ExpirationDate,
                                 UserDoc = d.UserDoc,
                                 User = new UserUI { FirstName = k.FirstName, LastName = k.LastName}

                             }).ToList();

但它给了我同样的结果

第三条路:

代码语言:javascript
复制
            var documents = (from d in DocumentDAO.GetDocument()
                             from k in UserDAO.GetUsers()
                             where ((DateTime.Now <= d.ExpirationDate) && (k.IdUser == d.UserDoc))
                             select new DocumentUI
                             {
                                 Title = d.Title,
                                 Description = d.Description,
                                 DateOfAdd = d.DateOfAdd,
                                 ExpirationDate = d.ExpirationDate,
                                 UserDoc = d.UserDoc,
                                 User = new UserUI { FirstName = k.FirstName, LastName = k.LastName}

                             }).ToList();

仍然没有,但是如果我删除(k.IdUser == d.UserDoc),它会向我展示这一文档和所有用户。

使用您的意见和想法更新--我写了以下文章:

代码语言:javascript
复制
 var now = DateTime.Now;
        var documents = DocumentDAO.GetDocument()
                    .Where(d => d.ExpirationDate > now)
                    .Select(d => new DocumentUI
             {
                 Title = d.Title,
                 Description = d.Description,
                 DateOfAdd = d.DateOfAdd,
                 ExpirationDate = d.ExpirationDate,
                 UserDoc = d.UserDoc,
                 User = new UserUI {
                     FirstName =UserDAO.GetUsers().First().FirstName,
                     LastName = UserDAO.GetUsers().First().LastName
                           }
             }).ToList(); 

但我仍然不检查UserDoc是否等于IdUser。我该把这个加在哪里呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-29 11:34:49

代码语言:javascript
复制
vat now = DateTime.Now;
var result = DocumentDAO.GetDocument()
                        .Where(d => d.ExpirationDate > now)
                        .Select(d => new {
                                           doc = d,
                                           firstname = d.User.FirstName,
                                           lastname = d.User.LastName
                                       });

更新

为了返回DocumentUI列表,请用以下语句替换Select()语句

代码语言:javascript
复制
.Select(d => new DocumentUI
                 {
                     Title = d.Title,
                     Description = d.Description,
                     DateOfAdd = d.DateOfAdd,
                     ExpirationDate = d.ExpirationDate,
                     UserDoc = d.UserDoc,
                     User = new UserUI { 
                                   FirstName = d.User.FirstName, 
                                   LastName = d.user.LastName
                               }
                 }).ToList(); 
票数 1
EN

Stack Overflow用户

发布于 2013-11-29 11:32:31

所以你应该有这样的东西:

代码语言:javascript
复制
var result = DocumentDAO.Where(d => d.expirationDate >= DateTime.Now).Select(d =>
                     new {
                       Document = d,
                       User = UserDAO.FirstOrDefault(u => u.idUser = d.UserDoc),
                       FirstName = User.firstName,
                       LastName = User.lastName,  
                     });

如果您使用EF作为ORM框架,并且在实体之间配置了适当的关系,则可能应该在Document中具有User属性。在这种情况下,这将更加容易:

代码语言:javascript
复制
var result = context.Documents.Where(d => d.expirationDate >= DateTime.Now).Select(d =>
                         new {
                           Document = d,
                           FirstName = d.User.firstName,
                           LastName = d.User.lastName,  
                         });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20284567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档