如何从方法返回LINQ对象?

时间:2013-10-08 18:12:00

标签: c# linq entity-framework

我的方法有多个表中的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返回类型是什么?

5 个答案:

答案 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)

您可以查看此question for returning IQueryable or Not

答案 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
}