如何从方法返回 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返回类型是什么?

如何从方法返回 LINQ 对象

根据您实际使用结果的方式,您可以返回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
}