好的,我已成功完成以下工作
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 IQueryablegetTicketInformation(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
.
你的意思是:
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
.
这一行在语法上是不正确的:
return ticketDetails.AsQueryable();
并应阅读
return ticketDetails.AsQueryable();
此外,您正在创建具有的匿名对象select new {
,但您想要创建myObject
实例.正确的实现将如下所示:
public IQueryablegetTicketInformation(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(...)
.