好了,我已经成功地完成了以下工作
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<myObject> 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>;
}
我认为这将使泛型的类型安全,但我得到错误“无法将方法组'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;
}
发布于 2009-01-20 03:06:41
你的意思是:
select new MyObject { TicketId = tickets.ticket_id,
Title = tickets.title, ...};
(请注意,我稍微调整了名称,使其更符合C#的习惯用法)
这是一个“对象初始化器”,它创建一个新的MyObject
(每条记录),并从源数据中分配属性。你得到的是一个“匿名类型”初始值设定项,这是不一样的。注意,如果你有一个非默认的构造函数,你也可以使用类似这样的东西:
select new MyObject(tickets.ticket_id, tickets.title);
它使用指定的构造函数,传入从源数据提供的值。
这将是IQueryable<MyObject>
;您不需要调用.AsQueryable()
。注与非类型化的IQueryable
相比,函数返回类型化的表单(IQueryable<MyObject>
)会更好。
发布于 2009-01-20 03:22:10
此行的语法不正确:
return ticketDetails.AsQueryable()<myObject>;
并且应该阅读
return ticketDetails.AsQueryable<myObject>();
此外,您正在使用select new {
创建匿名对象,但是您希望创建myObject
实例。正确的实现应该如下所示:
public IQueryable<myObject> 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
类上实现一个构造函数,并使用select new myObject(...)
在LINQ语句中调用它。
发布于 2009-01-20 03:14:24
正如Marc所说,当您的查询运行时,您不是在构造myObject
实例。但除此之外,您不需要将其强制转换为IQueryable<T>
,除非显式强制转换为IEnumerable<T>
,否则LINQ select语句将返回IQueryable<T>
。
此外,在尝试访问返回的数据之前,请注意DataContext尚未被处理。但是我注意到你的上下文不是在方法中构造的,注意不要让DataContext保持太长时间,它是一个工作单元对象,并不意味着要长时间保持打开。
https://stackoverflow.com/questions/460831
复制相似问题