我的方法有多个表中的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
返回类型是什么?
答案 0 :(得分:2)
您正在使用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)
答案 1 :(得分:1)
根据您实际使用结果的方式,您可以返回IQueryable
而不是IQueryable<T>
。
我在某些情况下(使用IEnumerable
)(如WebForms)使用了这种情况,它具有动态绑定(例如通过Eval或使用BoundField。
答案 2 :(得分:1)
如果您不想创建课程,可以使用元组:
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;
答案 3 :(得分:0)
创建一个包含所有列作为属性的自定义帮助程序类。说它的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。
答案 4 :(得分:0)
在您正在创建匿名对象的函数中,因此如果没有某些反射方法,则无法在调用者中使用。但是返回像
这样的对象要容易得多public class CustomerLocation
{
public string CustomerNumber {get; set;}
// and so on
}
可以放在公共层中,并由调用者和发件人访问,并显式使用属性。 为此你的功能更好
public IQueryable<CustomerLocation> GetLocation(string CustomerNum)
{
// your code here
}