如何从方法返回 LINQ 对象
本文关键字:LINQ 对象 返回 方法 | 更新日期: 2023-09-27 18:34:22
我有方法,该方法具有LINQ查询和查询从多个表返回列。
如何返回该 LINQ 结果对象并在调用方方法迭代结果中捕获它并分配给模型类?
public ??? GetLocation(string CustomerNum)
{
if (!string.IsNullOrEmpty(CustomerNum))
{
var results = from ca in _context.CUS_ADDRESS
join cad in _context.CUS_ADDRESS_DETAIL on ca.CUS_ADDRESS_ID equals cad.CUS_ADDRESS_ID
where (cad.PRIORITY_SEQ == 0) && (ca.MASTER_CUSTOMER_ID == CustomerNum)
select new
{
CustomerNumber = ca.MASTER_CUSTOMER_ID,
ca.ADDRESS_1,
ca.ADDRESS_2,
ca.ADDRESS_3,
ca.ADDRESS_4,
ca.CITY,
ca.STATE,
ca.COUNTRY_DESCR,
cad.ADDRESS_TYPE_CODE,
cad.ADDRESS_STATUS_CODE
};
return results;
}
else
{
return null;
}
}
调用方方法
var results = Data.GetLocation(CustomerNum)
if (results.Any())
{
var location = results.FirstOrDefault();
.....
.....
}
GetLocation
返回类型是什么?
根据您实际使用结果的方式,您可以返回IQueryable
而不是IQueryable<T>
。
我在某些情况下(使用IEnumerable
)使用它,例如WebForms,具有动态绑定(例如通过Eval或使用BoundField)。
你正在使用 select new
创建一个匿名对象,你不能从你的函数返回匿名对象的集合,相反,你必须创建一个类,该类将具有 select
语句中的所有属性,然后返回IQueryable<YourClass>
class YourClass
{
public int CustomerNumber { get; set; }
public string ADDRESS_1 { get; set; }
//..............
}
然后:
var results = from ca in _context.CUS_ADDRESS
join cad in _context.CUS_ADDRESS_DETAIL on ca.CUS_ADDRESS_ID equals cad.CUS_ADDRESS_ID
where (cad.PRIORITY_SEQ == 0) && (ca.MASTER_CUSTOMER_ID == CustomerNum)
select new YourClass
{
CustomerNumber = ca.MASTER_CUSTOMER_ID,
ADDRESS_1 = ca.ADDRESS_1,
//...............
并将函数返回类型修改为:
public IQueryable<YourClass> GetLocation(string CustomerNum)
你可以看看这个问题是否返回智商
如果你不想创建一个类,你可以使用元组:
public IEnumerable<Tuple<int, string, string>> GetCustomer(int custId) {
return from p in customers
where p.Id == custId
select new Tuple<int, string, string>(
p.Id,
p.FirstName,
p.LastName
);
}
尽管这意味着您无法命名其字段,因为您访问的数据如下:
var customer = GetCustomer(1);
var custId = customer.Item1;
var custFirstName = customer.Item2;
var custLastName = customer.Item3;
创建一个将所有列作为属性的自定义帮助程序类。说它的MyClass。填写如下。我知道这不是你想要的,但会帮助你得到你想要的。
var o= (from c in context.table1
from d in context.table2
where c.key=d.key
select new MyClass
{
Property1=c.abc,
Property2=d.xyz
}).SingleOrDefault();
或者以这样一种方式编写您的连接以及在哪里,它只会给您单行 fron db。
在函数中,您正在创建一个匿名对象,因此如果没有一些反射方法,则无法在调用者中使用。但是返回像
public class CustomerLocation
{
public string CustomerNumber {get; set;}
// and so on
}
它可以放置在公共层中,由调用方和发送方访问,并显式使用属性。为此,您的函数最好是
public IQueryable<CustomerLocation> GetLocation(string CustomerNum)
{
// your code here
}