当前位置:  开发笔记 > 编程语言 > 正文

Linq To Sql从函数返回为IQueryable <T>

如何解决《LinqToSql从函数返回为IQueryable<T>》经验,为你挑选了2个好方法。

好的,我已成功完成以下工作

public IQueryable getTicketInformation(int ticketID)
{
    var ticketDetails = from tickets in _context.tickets
        join file in _context.file_objects on tickets.ticket_id equals file.source_id
        where tickets.ticket_id == ticketID
        select new { tickets.ticket_id, tickets.title, tickets.care_of_email, file.filename };

    return ticketDetails.AsQueryable();
}

我继续创建自己的类(myObject),其中包含基元ticket_id,title,care_of_email和filename.我在linq声明中返回的是哪些项目.

我修改了我的陈述

public IQueryable getTicketInformation(int ticketID)
{
    var ticketDetails = from tickets in _context.tickets
        join file in _context.file_objects on tickets.ticket_id equals file.source_id
        where tickets.ticket_id == ticketID
        select new { tickets.ticket_id, tickets.title, tickets.care_of_email, file.filename };

    return ticketDetails.AsQueryable();
}

认为这会使泛型的类型安全,但我得到错误"无法将方法组'AsQueryable'转换为非委托类型'System.Linq.IQueryable'.你打算调用该方法吗?"

我甚至想做什么?

myObject类是否需要实现IEnumerable或IQueryable?

或者最好从linq结果集构造对象MyObject,然后从函数返回对象MyObject

public myObject getTicketInformation(int ticketID) 
{

    ....linq statement....
    myObject o = null;

    foreach (obj in linqstatemt)
    {
        o = new myObject();
        o.ticket_id = obj.ticket_id
        .......
    }
    return o;
}

Marc Gravell.. 14

你的意思是:

select new MyObject { TicketId = tickets.ticket_id,
     Title = tickets.title, ...};

(注意我稍微调整了一些名字,以便更加C#-idiomatic)

这是一个"对象初始值设定项",它创建一个新的MyObject(每个记录)并从源数据中分配属性.你有一个"匿名类型"初始化程序,它是不一样的.请注意,如果您有非默认构造函数,您还可以使用以下内容:

select new MyObject(tickets.ticket_id, tickets.title);

它使用指定的构造函数,从源数据传入提供的值.

这将是IQueryable; 你不需要打电话.AsQueryable().请注意,函数返回类型化的form(IQueryable)比使用untyped 更好IQueryable.



1> Marc Gravell..:

你的意思是:

select new MyObject { TicketId = tickets.ticket_id,
     Title = tickets.title, ...};

(注意我稍微调整了一些名字,以便更加C#-idiomatic)

这是一个"对象初始值设定项",它创建一个新的MyObject(每个记录)并从源数据中分配属性.你有一个"匿名类型"初始化程序,它是不一样的.请注意,如果您有非默认构造函数,您还可以使用以下内容:

select new MyObject(tickets.ticket_id, tickets.title);

它使用指定的构造函数,从源数据传入提供的值.

这将是IQueryable; 你不需要打电话.AsQueryable().请注意,函数返回类型化的form(IQueryable)比使用untyped 更好IQueryable.



2> David Schmit..:

这一行在语法上是不正确的:

return ticketDetails.AsQueryable();

并应阅读

return ticketDetails.AsQueryable();

此外,您正在创建具有的匿名对象select new {,但您想要创建myObject实例.正确的实现将如下所示:

public IQueryable getTicketInformation(int ticketID)
{

    return from tickets in _context.tickets
        join file in _context.file_objects on tickets.ticket_id equals file.source_id
        where tickets.ticket_id == ticketID
        select new myObject() { 
            ticket_id = tickets.ticket_id,
            title = tickets.title, 
            care_of_email = tickets.care_of_email, 
            filename = file.filename
        };

}

new SomeClass() { Property = value, ...语法创建一个SomeClass实例,并设置属性给定值.或者,您可以在myObject类上实现构造函数,并在linq语句中调用它select new myObject(...).

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有