5

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

4

5 回答 5

3

根据您实际使用结果的方式,您可以返回 anIQueryable而不是IQueryable<T>.

我在某些情况下(使用IEnumerable)使用了它,例如 WebForms,它们具有动态绑定(例如通过Eval或使用BoundField

于 2013-10-08T20:04:53.953 回答
1

您正在创建一个匿名对象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)

您可以查看此问题以返回 IQueryable 或 Not

于 2013-10-08T18:14:35.993 回答
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;
于 2013-10-08T20:14:05.760 回答
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();

或者写下你的连接和位置,这样它只会给你单行来自 db。

于 2013-10-08T18:24:12.540 回答
0

在函数中,您正在创建一个匿名对象,因此如果没有一些反射方法,就不能在调用者中使用。但是返回一个像这样的对象会容易得多

public class CustomerLocation
{
public string CustomerNumber {get; set;}
// and so on
}

可以将其放置在公共层中,并由调用者和发送者访问,并显式使用属性。为此,您的功能最好是

public IQueryable<CustomerLocation> GetLocation(string CustomerNum)
{
// your code here
}
于 2013-10-09T05:33:11.043 回答