[英]Linq To Sql return from function as IQueryable<T>
好的,我已成功完成以下工作
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;
}
你的意思是:
select new MyObject { TicketId = tickets.ticket_id,
Title = tickets.title, ...};
(注意我稍微调整了一些名字,以便更加C#-idiomatic)
这是一个“对象初始值设定项”,它创建一个新的MyObject
(每个记录)并从源数据中分配属性。 你有一个“匿名类型”初始化程序,它是不一样的。 请注意,如果您有非默认构造函数,您还可以使用以下内容:
select new MyObject(tickets.ticket_id, tickets.title);
它使用指定的构造函数,从源数据传入提供的值。
这将是IQueryable<MyObject>
; 你不需要调用.AsQueryable()
。 请注意,函数返回类型化表单( IQueryable<MyObject>
)比使用无类型IQueryable
更好。
这一行在语法上是不正确的:
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语句中调用它。
正如Marc所说,在运行查询时,你并没有构造myObject
实例。 但另外你不需要将它IQueryable<T>
转换为IQueryable<T>
,LINQ select语句将返回IQueryable<T>
除非明确地强制转换为IEnumerable<T>
。
另外,在尝试访问返回的数据之前,请注意没有丢弃DataContext。 但我注意到你的上下文不是在方法中构造的,要小心你没有长时间维护DataContext,它是一个工作单元对象,并不打算长时间保持打开状态。
Gents,只要您只返回单个表,这一切都有意义,但是如果有两个或更多要返回怎么办?
RPDTDataContext smdt = new RPDTDataContext();
var projectedUsers = smdt.SM_Users.Join(
smdt.SM_CTSGroups, u => u.CtsGroupID, c => c.id,
(u, c) => new { CTSGroup = c.Name, UserName = u.Name, u.EmpID, u.Email });
return projectedUsers;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.